【问题标题】:Counting agruped values: Include 0 values when using summarise(n())计算 agruped 值:使用 summarise(n()) 时包括 0 个值
【发布时间】:2018-06-15 15:29:57
【问题描述】:

我有这个数据框:

> 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

如何在 out 的创建代码中包含 0 个值(c = 0d = 0),以便自动生成任何字母(abc 或 @987654331 @)?

【问题讨论】:

标签: r dplyr


【解决方案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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 2021-03-16
      • 2016-09-03
      • 1970-01-01
      • 2021-04-13
      • 2017-10-03
      • 1970-01-01
      • 2021-11-22
      • 2016-10-02
      • 1970-01-01
      相关资源
      最近更新 更多