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 行。
在 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因此它至少包含每个字母中的一个。
我们可以“ID”转换为factor与levels指定的,只是使用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)