在R中使用聚合函数时,波形符和“by”之间的差异

时间:2013-11-07 13:21:47

标签: r dataframe aggregate

每次我在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)

两者之间有什么区别?你什么时候使用它?

2 个答案:

答案 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

现在,停下来记下任何差异。

我想到的两个是:

  1. 公式方法可以更好地保留names ,但它不允许您直接在命令中控制名称,而可以 em>在data.frame方法中执行:

    aggregate(cbind(NewX1 = mydf$X1, NewX2 = mydf$X2, NewX3 = mydf$X3), 
              by = list(NewA = mydf$A, NewB = mydf$B), sum)
    
  2. 公式方法和data.frame方法以不同方式处理NA值。要使用公式方法获得与data.frame方法相同的结果,您需要使用na.action = na.pass

    aggregate(. ~ A + B, mydf, sum, na.action=na.pass)
    
  3. 同样,说“我认为这不重要”并不完全错误,我不会在这里说明我的偏好,因为那不是Stack Overflow的真正含义,但重要的是始终在做出这样的决定之前,请仔细阅读功能文档。

答案 1 :(得分:1)

在帮助页面中

aggregate.formula is a standard formula interface to aggregate.data.frame

所以我认为这不重要。使用您认为合适的方法,或者适合您工作区中现有变量和公式的方法。