如果您只想保留原始列名并一次在一列内操作,使用聚合函数似乎比 dplyr 更好。避免使用汇总功能,
来自汇总函数文档的注释
使用现有变量名时要小心;相应的列将立即使用新数据更新,这可能会影响引用这些变量的后续操作。
例如
## modified example from aggregate documentation with character variables and NAs
testDF <- data.frame(v1 = c(1,3,5,7,8,3,5,NA,4,5,7,9),
v2 = c(11,33,55,77,88,33,55,NA,44,55,77,99) )
by <- c("red", "blue", 1, 2, NA, "big", 1, 2, "red", 1, NA, 12)
aggregate(x = testDF, by = list(by1), FUN = "sum")
Group.1 v1 v2
1 1 15 165
2 12 9 99
3 2 NA NA
4 big 3 33
5 blue 3 33
6 red 5 55
你得到你想要的,但是当你使用 summarise 和 ddply 时,你需要指定名称。所以如果你有很多列,聚合似乎很方便。
testDF$ID=by1
ddply(testDF, .(ID), summarize, v1=sum(v1), v2=sum(v2) )
ID v1 v2
1 1 15 165
2 12 9 99
3 2 NA NA
4 big 3 33
5 blue 3 33
6 red 5 55
7 <NA> 15 165
要查看使用汇总立即更新列的效果,您可以查看以下示例,
ddply(testDF, .(ID), summarize, v1=max(v1,v2), v2=min(v1,v2) )
ID v1 v2
1 1 55 55
2 12 99 99
3 2 NA NA
4 big 33 33
5 blue 33 33
6 red 44 11
7 <NA> 88 77
ddply(testDF, .(ID), summarize, v1=min(v1,v2), v2=min(v1,v2) )
ID v1 v2
1 1 5 5
2 12 9 9
3 2 NA NA
4 big 3 3
5 blue 3 3
6 red 1 1
7 <NA> 7 7
请注意,当 V1 使用 max 时,在计算 v2 时 col 已经更新,因此例如在 ID=1 的情况下,我们在 v2 中使用 min 时无法得到数字 5。