【问题标题】:Difference between tilde and "by" while using aggregate function in R在 R 中使用聚合函数时波浪号和“by”之间的区别
【发布时间】:2013-11-07 13:21:47
【问题描述】:

每次我对 data.frame 进行聚合时,我默认使用 "by = list(...)" 参数。但我确实看到了关于 stackoverflow 和其他地方的解决方案,其中波浪号 (~) 在“公式”参数中使用。我有点将“by”参数视为围绕这些变量的“pivot”。

在某些情况下,输出完全相同。例如:

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)

这两者有什么区别,什么时候用哪个?

【问题讨论】:

    标签: r dataframe aggregate


    【解决方案1】:

    我不会完全不同意您使用哪种方法并不重要,但是,重要的是要注意它们的行为确实不同。

    我会用一个小例子来说明。

    以下是一些示例数据:

    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 方面做得更好它不允许您直接在命令中控制名称,而可以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)
      

    再说一次,说“我认为这并不重要”并不是完全错误的,而且我不会在这里陈述我的偏好,因为这并不是 Stack Overflow 的真正意义所在,但重要的是始终在做出此类决定之前,请仔细阅读函数文档。

    【讨论】:

    • 关于处理 NA 的区别的要点。遗憾的是,R 函数的执行方式并不是特别一致。
    • 我知道这是一个旧答案,但我要补充一点,“by”界面可以通过执行aggregate(mydf[c("X1","X2","X3")], mydf[c("A","B")], sum) 之类的操作来大大简化,因为data.frameslists。您也可以在公式界面中重命名aggregate(cbind(NewX1=X1,NewX2=X2,NewX3=X3) ~ cbind(NewA=A) + cbind(NewB=B), data=mydf, sum)不用担心。
    【解决方案2】:

    从帮助页面,

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 2012-07-20
      • 2020-10-10
      • 2017-12-05
      • 2015-04-03
      • 2019-04-09
      • 1970-01-01
      • 2021-11-15
      相关资源
      最近更新 更多