按照所有因子水平聚合(包括存在和不存在的)

3

我可以使用以下代码简单地使用dplyr聚合一个data.frame:

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

1
你可以像这样使用tapplytapply(z$b, z$b, length) - Raad
1
我认为这是一个在Github上的开放问题 - JasonAizkalns
3个回答

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

一种解决方法是使用包含所有级别的表进行连接:

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

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

0
你可以使用xtabs:
xtabs(a ~ b, z)

这个聚合了 z$b 而不是像你的例子中只计算 z$a 的级别,但是可以很容易地通过 table 实现:

table(z$a)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接