能否使用一个自定义函数聚合两列数据并返回一列数据?
假设我有一个数据框:
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上调用pathlength,给出了如下结果:
# 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循环来解决这个问题,因为我认为对于大数据集来说速度会很慢。
stack(lapply(split(data[-1], data[1]), pathlength))
- BrodieG