如何在summarise()内对n()进行条件过滤统计符合要求的行数
正确调整方案
你编写的代码无法得到预期结果的核心原因是:n() 返回的是当前汇总分组的总行数,是一个长度为1的标量值,无法用长度等于原数据行数的逻辑向量 cyl == 4 做索引筛选。
要实现条件计数,直接对条件逻辑值求和即可:逻辑值中 TRUE 对应数值1、FALSE 对应数值0,求和结果刚好等于满足条件的行数。
调整后的可运行代码如下:
mtcars %>% summarise(n = n(), avg_mpg = mean(mpg), n_cyl4 = sum(cyl == 4), avg_mpg_cyl4 = mean(mpg[cyl == 4]))
其他可选写法
如果遇到更复杂的计数场景,可按需选择以下实现方式:
- 带缺失值排除的条件计数:
sum(ifelse(cyl == 4, 1, NA), na.rm = TRUE),适合需要先过滤掉cyl为空的行再计数的场景 - 多条件批量计数:如果要同时统计多个
cyl取值的行数,可以先用dplyr::count(cyl)做分组计数,再用tidyr::pivot_wider()转成宽格式汇总表,适合统计维度多的场景。
内容的提问来源于stack exchange,提问作者sleepysleeps
相关产品推荐
相关产品推荐

