R语言中按年龄段统计多列非NA值的方法——dplyr包summarise_if函数使用n报错问题
问题解决:按年龄段统计每列非NA值数量
首先咱们拆解下你遇到的问题:你想按age_grp分组,对每个整数类型的列(Q1-Q50)统计非NA值的数量,但用n时出错,换成mean能运行但结果完全不符合需求。这背后的原因和解决方法如下:
为什么n会失效?
dplyr里的n()函数是用来统计当前分组的总行数的,它不需要任何额外参数(包括na.rm)。当你在summarise_if里写n, na.rm=TRUE时,相当于尝试调用n(na.rm=TRUE),但n()根本没有这个参数,自然会触发参数不匹配的错误。
而mean()能运行只是因为它本身支持na.rm参数,但它计算的是列的均值,完全不是你要的非NA值数量。
正确的解决方案
你需要对每一列单独统计非NA值的个数,这里有两种写法,分别适配新旧版本的dplyr:
方法1:用summarise_if(兼容旧版dplyr)
自定义匿名函数,通过sum(!is.na(.x))来统计每列的非NA值数量:
library(dplyr) df2 <- df %>% group_by(age_grp) %>% summarise_if(is.integer, ~sum(!is.na(.x)))
方法2:用across(新版dplyr推荐写法)
由于summarise_if已被软弃用,新版dplyr更推荐用across函数来指定要处理的列:
df2 <- df %>% group_by(age_grp) %>% summarise(across(where(is.integer), ~sum(!is.na(.x))))
这两种写法都能精准实现你的需求:按年龄段分组,统计每个整数列的非NA值数量。
内容的提问来源于stack exchange,提问作者SilverSpringbb
相关产品推荐
相关产品推荐

