【问题标题】:R - Aggregate Function different Results When Adding new grouping columnR - 添加新分组列时聚合函数不同的结果
【发布时间】:2018-12-12 02:25:35
【问题描述】:

我是 R 初学者,我被困住了,找不到解决方案。任何评论都受到高度赞赏。问题来了:

我有一个数据框 df。 这些列被转换为 char(属性)和 num。 我想通过使用聚合函数来减少数据帧(dply 不是一个选项)。

当我使用聚合时

df_agg <- aggregate(df["AMOUNT"], df[c("ATTRIBUTE1")], sum)

我得到正确的结果。但我想按更多属性分组。例如添加更多属性时

df_agg <- aggregate(df["AMOUNT"], df[c("ATTRIBUTE1", "ATTRIBUTE2")], sum)

然后在某个时候,聚合结果会发生变化。 Amount 的总和不再等于第一个第一个聚合(或原始数据帧)的结果。

有谁知道导致这种行为的原因。

【问题讨论】:

    标签: r aggregate-functions


    【解决方案1】:

    我的最佳猜测是您的某些分组列中缺少值。在内置的mtcars数据上演示,没有缺失值,一切正常:

    sum(mtcars$mpg)
    # [1] 642.9
    sum(aggregate(mtcars["mpg"], mtcars[c("am")], sum)$mpg)
    # [1] 642.9
    sum(aggregate(mtcars["mpg"], mtcars[c("am", "cyl")], sum)$mpg)
    # [1] 642.9
    

    但是如果我们在分组变量中引入缺失值,它就不会包含在聚合中:

    mt = mtcars
    mt$cyl[1] = NA
    sum(aggregate(mt["mpg"], mt[c("am", "cyl")], sum)$mpg)
    # [1] 621.9
    

    最简单的解决方法是用 NA 以外的其他值填充缺失值,也许是字符串 "missing"

    【讨论】:

      【解决方案2】:

      我认为@Gregor 已正确指出问题可能是具有NA 的分组变量。 dplyr 处理 NA 的变量分组方式与 aggregate 不同。

      我们有aggregate 的替代解决方案。请注意,该文件建议

      `by`   a list of grouping elements, each as long as the variables in the data
             frame x. The elements are coerced to factors before use.
      

      这里有线索。您可以使用exclude="" 将分组变量转换为factor,这将确保NA 是因素的一部分。

      set.seed(1)
      
      df <- data.frame(ATTRIBUTE1 = sample(LETTERS[1:3], 10, replace = TRUE),
                       ATTRIBUTE2 = sample(letters[1:3], 10, replace = TRUE),
                       AMOUNT = 1:10)
      
      df$ATTRIBUTE2[5] <- NA
      
      
      aggregate(df["AMOUNT"], by = list(factor(df$ATTRIBUTE1,exclude = ""),
                                        factor(df$ATTRIBUTE2, exclude="")), sum)
      
      #   Group.1 Group.2 AMOUNT
      # 1       A       a      1
      # 2       B       a      2
      # 3       B       b      9
      # 4       C       b     10
      # 5       A       c     10
      # 6       B       c     11
      # 7       C       c      7
      # 8       A    <NA>      5
      

      分组变量未显式转换为factor以包含NA时的结果为:

      aggregate(df["AMOUNT"], df[c("ATTRIBUTE1", "ATTRIBUTE2")], sum)
      #   ATTRIBUTE1 ATTRIBUTE2 AMOUNT
      # 1          A          a      1
      # 2          B          a      2
      # 3          B          b      9
      # 4          C          b     10
      # 5          A          c     10
      # 6          B          c     11
      # 7          C          c      7     
      

      【讨论】:

      • 使用 factor 和 exclude = NULL 对我有用(exclude = “” 不起作用)。非常感谢。是的,在各个列中都有 NA。
      猜你喜欢
      • 1970-01-01
      • 2018-06-24
      • 2019-12-27
      • 2019-05-06
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      相关资源
      最近更新 更多