使用dplyr group_by与count()分组计数生成布尔列的问题求助
解决dplyr分组统计特定值数量的问题
你的问题出在在dplyr::summarise()中错误使用了count()函数——count()是用来对数据框(或分组后的数据框)的行进行全局计数的工具,当你传入eye_color == "blue"这个布尔向量时,它会将其视为单列数据框处理,返回包含布尔值列的计数结果,这和你想要的分组统计需求不匹配。
下面是几种正确的实现方式,均可得到你预期的按sex分组统计蓝色眼睛数量的结果:
方法1:用sum()统计布尔值数量
R中布尔值会被自动转换为1(TRUE)和0(FALSE),直接用sum()就能统计符合条件的行数,若要保留无匹配项时的NA显示,可调整参数:
data("starwars") starwars %>% group_by(sex) %>% summarise(Freq = case_when( sum(eye_color == "blue", na.rm = TRUE) == 0 ~ NA_integer_, TRUE ~ sum(eye_color == "blue", na.rm = TRUE) ))
方法2:先过滤再分组计数
如果你更习惯用count(),可以先筛选出蓝色眼睛的记录,再按sex分组计数,最后补全所有原始分组(包括NA):
library(tidyr) starwars %>% filter(eye_color == "blue") %>% count(sex, name = "Freq") %>% complete(sex = unique(starwars$sex), fill = list(Freq = NA))
方法3:用dplyr::tally()简化统计
tally()是summarise(n = n())的简化版,支持直接传入布尔向量统计符合条件的数量:
starwars %>% group_by(sex) %>% tally(eye_color == "blue", name = "Freq") %>% mutate(Freq = ifelse(Freq == 0, NA_integer_, Freq))
运行以上代码后,均可得到类似你预期的结果:
# A tibble: 4 × 2 sex Freq <chr> <int> 1 female 6 2 male 12 3 hermaphroditic NA 4 <NA> 1
内容的提问来源于stack exchange,提问作者Ahir Bhairav Orai
相关产品推荐
相关产品推荐

