R group by 显示所有因子水平的计数,即使 dplyr 为零

Chi*_*ble 6 r dplyr

set.seed(1)
dat <- data.frame(ID = sample(letters,50,rep=TRUE))
dat %>% 
  group_by(ID) %>%
  summarise(no_rows = length(ID))
Run Code Online (Sandbox Code Playgroud)

我有上面的代码,它创建了一个随机的字母样本。但是,即使为零,我也可以使汇总输出显示所有计数级别。

当我运行上面的代码时,有时会得到 20 行,有时会得到 25 行,等等。我希望每次都返回 26 行。

Nic*_*ick 6

在 akrun 接受的答案中,table()有效,但tidyverse答案给出了不准确的计数(见下文)。而是使用该.drop = FALSE选项:

library(tidyverse)
set.seed(1)
dat <- data.frame(ID = sample(letters,50,rep=TRUE))
dat %>%
  mutate(ID = factor(ID, levels = letters)) %>%
  count(ID, name = "no_rows", .drop = F) %>%
  print.data.frame()
#>    ID no_rows
#> 1   a       3
#> 2   b       2
#> 3   c       1
#> 4   d       1
#> 5   e       3
#> 6   f       3
#> 7   g       2
#> 8   h       1
#> 9   i       2
#> 10  j       5
#> 11  k       1
#> 12  l       3
#> 13  m       0
#> 14  n       3
#> 15  o       3
#> 16  p       0
#> 17  q       0
#> 18  r       1
#> 19  s       1
#> 20  t       3
#> 21  u       3
#> 22  v       1
#> 23  w       2
#> 24  x       0
#> 25  y       5
#> 26  z       1
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2019 年 11 月 22 日创建

请注意,我们期望除 m、p、q 和 x 之外的所有字母的计数都为非零:

set.seed(1)
dat <- data.frame(ID = sample(letters,50,rep=TRUE))
levels(dat$ID)
#>  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "n" "o" "r" "s" "t"
#> [18] "u" "v" "w" "y" "z"
Run Code Online (Sandbox Code Playgroud)

但是如果我们使用,complete()我们会得到一个:

set.seed(1)
dat <- data.frame(ID = sample(letters,50,rep=TRUE))
dat %>% 
  mutate(ID=factor(ID, levels = letters)) %>% 
  complete(ID) %>%
  group_by(ID) %>%
  summarise(no_rows = n()) %>%
  print.data.frame()
#>    ID no_rows
# ...
#> 12  l       3
#> 13  m       1  # should be 0
#> 14  n       3
#> 15  o       3
#> 16  p       1  # should be 0
#> 17  q       1  # should be 0
#> 18  r       1
#> 19  s       1
#> 20  t       3
#> 21  u       3
#> 22  v       1
#> 23  w       2
#> 24  x       1  # should be 0
#> 25  y       5
#> 26  z       1
Run Code Online (Sandbox Code Playgroud)

那是因为complete()实际上添加了单个 m、p、q 和 x,ID因此它至少包含每个字母中的一个。


akr*_*run 5

我们可以“ID”转换为factorlevels指定的,只是使用table

table(factor(dat$ID, levels = letters))
Run Code Online (Sandbox Code Playgroud)

或者使用相同的 tidyverse

library(tidyverse)
dat %>% 
  mutate(ID=factor(ID, levels = letters)) %>% 
  complete(ID) %>%
  group_by(ID) %>%
  summarise(no_rows = n())
Run Code Online (Sandbox Code Playgroud)