【问题标题】:R: aggregate by all factor levels (present and not present)R:按所有因子水平汇总(存在和不存在)
【发布时间】:2016-03-18 18:36:40
【问题描述】:

我可以将data.framedplyr 简单地聚合为以下内容:

z <- data.frame(a = rnorm(20), b = rep(letters[1:4], each = 5))

library(dplyr)

z %>%
  group_by(b) %>%
  summarise(out = n())

Source: local data frame [4 x 2]

       b   out
  (fctr) (int)
1      a     5
2      b     5
3      c     5
4      d     5

但是,有时数据集可能会缺少一个因素。在这种情况下,我希望输出为0

例如,假设典型的数据集应该有 5 个组。

z$b <- factor(z$b, levels = letters[1:5])

但很明显,这个特定中没有任何内容,但可能在另一个中。我怎样才能聚合这些数据,所以缺少factorslength0

期望的输出:

Source: local data frame [4 x 2]

       b   out
  (fctr) (int)
1      a     5
2      b     5
3      c     5
4      d     5
5      e     0

【问题讨论】:

标签: r aggregate dplyr


【解决方案1】:

解决此问题的一种方法是使用“tidyr”中的complete。您必须首先使用mutate 来分解“b”列:

library(dplyr)
library(tidyr)

z %>%
  mutate(b = factor(b, letters[1:5])) %>%
  group_by(b) %>%
  summarise(out = n()) %>%
  complete(b, fill = list(out = 0))
# Source: local data frame [5 x 2]
# 
#        b   out
#   (fctr) (dbl)
# 1      a     5
# 2      b     5
# 3      c     5
# 4      d     5
# 5      e     0

【讨论】:

    【解决方案2】:

    一种解决方法是加入一个包含所有级别的表:

    z <- full_join(z, data.frame(b=levels(z$b))
    

    这会将分析变量的所有缺失行设置为 NA,在一般情况下,这比将它们设置为零更有意义。如有必要,您可以使用 z[is.na(z)] &lt;- 0 将它们更改为零。

    【讨论】:

      【解决方案3】:

      你可以使用 xtabs:

      xtabs(a ~ b, z)
      

      这会聚合 z$b 而不是像您的示例中那样仅计算 z$a 中的级别,但这很容易通过 table 实现:

      table(z$a)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 2017-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-04
        • 1970-01-01
        相关资源
        最近更新 更多