每次我在data.frame上进行聚合时,我默认使用"by = list(...)"
参数。但我确实在stackoverflow和其他地方看到了解决方案,其中在“formula”参数中使用了tilde(〜)。我有点看到“by”参数作为围绕这些变量的“枢轴”。
在某些情况下,输出完全相同。例如:
aggregate(cbind(df$A, df$B, df$C), FUN = sum, by = list("x" = df$D, "y" = df$E))
AND
aggregate(cbind(df$A, df$B, df$C) ~ df$E, FUN = sum)
两者之间有什么区别?你什么时候使用它?
答案 0 :(得分:7)
我不会完全不同意您使用哪种方法并不重要,但重要的是要注意它们的行为方式不同。
我将用一个小例子说明。
以下是一些示例数据:
set.seed(1)
mydf <- data.frame(A = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4),
B = LETTERS[c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2)],
matrix(sample(100, 36, replace = TRUE), nrow = 12))
mydf[3:5] <- lapply(mydf[3:5], function(x) {
x[sample(nrow(mydf), 1)] <- NA
x
})
mydf
# A B X1 X2 X3
# 1 1 A 27 69 27
# 2 1 A 38 NA 39
# 3 1 A 58 77 2
# 4 2 A 91 50 39
# 5 2 A 21 72 87
# 6 3 B 90 100 35
# 7 3 B 95 39 49
# 8 3 B 67 78 60
# 9 3 B 63 94 NA
# 10 4 B NA 22 19
# 11 4 B 21 66 83
# 12 4 B 18 13 67
首先,公式界面。以下三个命令都将产生相同的输出。
aggregate(cbind(X1, X2, X3) ~ A + B, mydf, sum)
aggregate(cbind(X1, X2, X3) ~ ., mydf, sum)
aggregate(. ~ A + B, mydf, sum)
# A B X1 X2 X3
# 1 1 A 85 146 29
# 2 2 A 112 122 126
# 3 3 B 252 217 144
# 4 4 B 39 79 150
这是“by”界面的相关命令。输入相当麻烦(但如果需要,可以使用with
解决。)
aggregate(cbind(mydf$X1, mydf$X2, mydf$X3),
by = list(mydf$A, mydf$B), sum)
Group.1 Group.2 V1 V2 V3
1 1 A 123 NA 68
2 2 A 112 122 126
3 3 B 315 311 NA
4 4 B NA 101 169
现在,停下来记下任何差异。
我想到的两个是:
公式方法可以更好地保留names
,但它不允许您直接在命令中控制名称,而可以> em>在data.frame
方法中执行:
aggregate(cbind(NewX1 = mydf$X1, NewX2 = mydf$X2, NewX3 = mydf$X3),
by = list(NewA = mydf$A, NewB = mydf$B), sum)
公式方法和data.frame
方法以不同方式处理NA
值。要使用公式方法获得与data.frame
方法相同的结果,您需要使用na.action = na.pass
。
aggregate(. ~ A + B, mydf, sum, na.action=na.pass)
同样,说“我认为这不重要”并不完全错误,我不会在这里说明我的偏好,因为那不是Stack Overflow的真正含义,但重要的是始终在做出这样的决定之前,请仔细阅读功能文档。
答案 1 :(得分:1)
在帮助页面中
aggregate.formula is a standard formula interface to aggregate.data.frame
所以我认为这不重要。使用您认为合适的方法,或者适合您工作区中现有变量和公式的方法。