计算agruped值:使用summary(n())时包含0个值

时间:2018-01-05 19:26:07

标签: r dplyr

我有这个数据框:

> df <- data.frame(o = c(0,1,1,1), e = c(1, 1, 1, 1))
> df
  o e
1 0 1
2 1 1
3 1 1
4 1 1

我希望使用某些规则来获取数量。我试过这个:

out <- df %>% 
    mutate(L = case_when(o == 1 & e == 1 ~ 'a',
                         o == 0 & e == 1 ~ 'b',
                         o == 1 & e == 0 ~ 'c',
                         o == 0 & e == 0 ~ 'd')) %>%
    group_by(L) %>% 
    summarise(n())

通过这样做我节省了很多时间,但我明白了:

> out
# A tibble: 3 x 2
      l `n()`
  <chr> <int>
1     a     3
2     b     1

如何在c = 0的创建代码中包含0个值(d = 0out),以便为任何字母a {{{ 1}},bc)?

2 个答案:

答案 0 :(得分:1)

data.frame(table(factor(x = paste(df$o, df$e),
                        levels = c("1 1", "0 1", "1 0", "0 0"),
                        labels = c("a", "b", "c", "d"))))
#  Var1 Freq
#1    a    3
#2    b    1
#3    c    0
#4    d    0

答案 1 :(得分:1)

由于此标记为dplyr,因此您可以将代码修改为:

out <- df %>% 
  mutate(L = factor(case_when(o == 1 & e == 1 ~ 'a',
                              o == 0 & e == 1 ~ 'b',
                              o == 1 & e == 0 ~ 'c',
                              o == 0 & e == 0 ~ 'd'), 
                    levels = c('a', 'b', 'c', 'd'))) %>% 
  select(L) %>% table(L = .) %>% data.frame

正如其他人指出的那样,关键是要考虑因素L并添加所有必要的等级。

#out
#  L Freq
#1 a    3
#2 b    1
#3 c    0
#4 d    0