R:按所有因子水平汇总(存在且不存在)

时间:2016-03-18 18:36:41

标签: r aggregate dplyr

我可以使用以下内容将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])

但显然在这个特定的中没有任何东西,但可能在另一个中。如何汇总此数据,以便length factors 0Source: 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

期望的输出:

/^\w\s$/

3 个答案:

答案 0 :(得分:2)

解决此问题的一种方法是使用“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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

您可以使用xtabs:

xtabs(a ~ b, z)

这会聚合z $ b而不是像你的例子那样只计算z $ a中的等级,但这可以通过表格轻松实现:

table(z$a)