【问题标题】:Computing group means for categories with no observations in dplyr and data.table计算组意味着在 dplyr 和 data.table 中没有观察的类别
【发布时间】:2020-05-04 21:00:04
【问题描述】:

我有一个包含数值变量和分组变量的数据集,并且想要计算组均值。有些组是空的,即有一些因子水平没有出现在数据中。在计算分组平均值时,我希望将这些空组与非空组一起列出。使用 base R 很容易实现:

# Create an example of a data frame where variable1 is numeric and variable2 is a
# factor with three levels, two of which appear in the data:
df <- data.frame(variable1 = c(1,2,3,4), variable2 = factor(c("A","B","A","B")))
levels(df$variable2) <- c(levels(df$variable2), "C")

# Base R
tapply(df$variable1, df$variable2, mean)

渲染输出

A  B  C 
2  3 NA 

这就是我要找的。​​p>

但是,由于各种原因,我需要使用 dplyrdata.table 来代替。问题是两者都跳过了摘要中的空白级别:

library(dplyr)
df %>% group_by(variable2) %>%
  summarise(var1Mean = mean(variable1))

产量

# A tibble: 2 x 2
  variable2 var1Mean
  <fct>        <dbl>
1 A                2
2 B                3

library(data.table)
df <- as.data.table(df)
df[, mean(variable1), variable2]

产量

   variable2 V1
1:         A  2
2:         B  3

有没有办法让这些包中的任何一个在摘要中包含空组?

【问题讨论】:

    标签: r dplyr data.table


    【解决方案1】:

    您可以在group_by 中指定.drop = FALSE 以保留空组。

    library(dplyr)
    
    df %>%  
     group_by(variable2, .drop = FALSE) %>% 
     summarise(var1Mean = mean(variable1))
    
    # A tibble: 3 x 2
    #  variable2 var1Mean
    #  <fct>        <dbl>
    #1 A                2
    #2 B                3
    #3 C              NaN
    

    【讨论】:

      【解决方案2】:

      您可以在data.table 中执行此操作

      df[.(variable2 = levels(variable2)), on = 'variable2',
         mean(variable1), by = variable2]
      #    variable2 V1
      # 1:         A  2
      # 2:         B  3
      # 3:      <NA> NA
      

      如果dfvariable2 键入,则稍微干净一些:

      setkey(df, variable2)
      df[.(levels(variable2)), mean(variable1), by = variable2]
      

      【讨论】:

      • 不错!看来这仅在只有一个空组时才有效。如果我增加空组的数量levels(df$variable2) &lt;- c(levels(df$variable2), "C", "D"),这仍然只产生一行 (&lt;NA&gt; NA)。此外,它在摘要中显示 NA 而不是 C
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2020-05-31
      相关资源
      最近更新 更多