我有一个聚合的data.frame,它只是由plyr的ddply
完成的。现在的目标是编写一个将聚合对象自动绑定到原始数据的函数。问题是,可能有多个聚合变量。
以下是仅包含一个聚合变量的示例:
这里是我的数据框:
M O
1 1 6
2 2 7
3 2 4
4 1 6
然后使用ddply
我得到“O”的聚合:
TEST <- ddply(.data = DF,
.variables = c("M"),
.fun = summarise,
NEW = sum(O))
结果如下:
M NEW
1 1 12
2 2 11
我现在要做的是编写一个函数,使我能够将变量“New
”绑定到原始data.frame。
在循环中,它适用于:
for(i in 1:nrow(TEST)) {
DF$New[DF$M == TEST$M[i]] <- TEST$NEW[i]
}
M O New
1 1 6 12
2 2 7 11
3 2 4 11
4 1 6 12
现在我想将它转换为一个函数,即使只有一个聚合变量,也可以提供等效的输出。
答案 0 :(得分:5)
您可以在基准R中使用ave
和within
,并按如下方式添加多个列。假设您的data.frame被称为“mydf”:
within(mydf, {
P <- ave(O, M, FUN = sum)
Q <- ave(O, M, FUN = mean)
})
# M O Q P
# 1 1 6 6.0 12
# 2 2 7 5.5 11
# 3 2 4 5.5 11
# 4 1 6 6.0 12
当然,更好的是data.table
包:
library(data.table)
DT <- data.table(mydf)
DT[, `:=`(SUM = sum(O), MEAN = mean(O)), by = "M"]
DT
M O SUM MEAN
1: 1 6 12 6.0
2: 2 7 11 5.5
3: 2 4 11 5.5
4: 1 6 12 6.0
答案 1 :(得分:4)
就像我在评论中说的那样:
ddply(.data = DF,
.variables = c("M"),
.fun = transform,
NEW = sum(O))
M O NEW
1 1 6 12
2 1 6 12
3 2 7 11
4 2 4 11