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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:47:41