You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:35:23