按组统计观测数及多列零值/NA值的高效实现方法
高效实现分组统计总观测数与多列零值/NA数量
不用拆分数据框再合并,直接在summarise里一次性搞定所有统计需求:
library(dplyr) mtcars %>% group_by(cyl) %>% summarise( # 每组总观测数 total_obs = n(), # 统计指定列的零值数量,按需修改列列表 across(c(mpg, disp, hp), ~sum(.x == 0, na.rm = TRUE), .names = "{col}_zero_count"), # 统计指定列的NA值数量 across(c(mpg, disp, hp), ~sum(is.na(.x)), .names = "{col}_na_count") )
关键说明
n():这是dplyr分组统计总数的标准操作,直接返回每组的真实总观测数,不会像你原代码那样出现非零值的错误。across():替代旧版的summarise_each,可以批量处理多列,.names参数能自动生成清晰的列名,比如mpg_zero_count、mpg_na_count。- 如果要统计所有数值列,把
c(mpg, disp, hp)换成where(is.numeric)就行,不用手动列每一列。 - 统计零值时的
na.rm = TRUE是为了忽略NA,避免NA影响统计结果;如果想把NA也算作零值,删掉这个参数即可。
原代码问题点
你原代码里的summarise_each(funs(sum(0)))完全不对,会输出全0的列;而且用mutate加count再summarise的方式纯属冗余,直接在summarise里用n()就能拿到正确的每组总数。
内容的提问来源于stack exchange,提问作者Agustín Indaco
相关产品推荐
相关产品推荐

