gpt4 book ai didi

r - 如何在 R 中使用使用两列的自定义函数进行聚合

转载 作者:行者123 更新时间:2023-12-01 08:54:37 25 4
gpt4 key购买 nike

是否可以与使用两列返回一列的自定义函数进行聚合?

假设我有一个数据框:

x <- c(2,4,3,1,5,7)
y <- c(3,2,6,3,4,6)
group <- c("A","A","A","A","B","B")

data <- data.frame(group, x, y)
data
# group x y
# 1 A 2 3
# 2 A 4 2
# 3 A 3 6
# 4 A 1 3
# 5 B 5 4
# 6 B 7 6

我有我想在两列(x 和 y)上使用的函数:

pathlength <- function(xy) {
out <- as.matrix(dist(xy))
sum(out[row(out) - col(out) == 1])
}

我尝试了以下聚合:

out <- aggregate(cbind(x, y) ~ group, data, FUN = pathlength)  
out <- aggregate(cbind(x, y) ~ group, data, function(x) pathlength(x))

但是,这会分别而不是一起调用 x 和 y 上的路径长度,给我:

#  group x y
#1 A 5 8
#2 B 2 2

我想要的是在 x 和 y 上调用 pathlength 并以这种方式聚合它。这是我想要聚合做的事情:

realA <- matrix(c(2,4,3,1,3,2,6,3), nrow=4, ncol=2)
pathlength(realA)
# [1] 9.964725

realB <- matrix(c(5,7,4,6), nrow=2, ncol=2)
pathlength(realB)
# [1] 2.828427

group <- c("A", "B")
pathlength <- c(9.964725,2.828427)
real_out <- data.frame(group, pathlength)
real_out
# group pathlength
# 1 A 9.964725
# 2 B 2.828427

有人有什么建议吗?还是有一些我在谷歌上找不到的其他功能可以让我这样做?我宁愿不使用 for 循环来解决这个问题,因为我假设它对于大数据集来说会很慢。

最佳答案

正如您所发现的,基本 aggregate() 函数一次只能处理一列。相反,您可以使用 by() 函数

by(data[,c("x","y")], data$group, pathlength)
data$group: A
[1] 9.964725
-----------------------------------------------------------------------
data$group: B
[1] 2.828427

split()/lapply()

lapply(split(data[,c("x","y")], data$group), pathlength)
$A
[1] 9.964725

$B
[1] 2.828427

关于r - 如何在 R 中使用使用两列的自定义函数进行聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30228590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com