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

按分组聚合计算指定列非NA值计数、均值和标准差的问题

解决aggregate分组统计单列非缺失值的问题

我明白你遇到的问题了——你本来只想统计var1列的分组非缺失数、均值和标准差,但因为代码里用了.,导致aggregate偷偷处理了所有列,把多列的非缺失值混在一起计算,结果自然和预期不符。

问题根源

你写的aggregate(. ~ treatment, ...)里的.代表除分组列treatment之外的所有列,所以你的自定义函数会被分别应用到var1和var2上。之后do.call(data.frame,...)会把两列的统计结果合并成一个数据框,列名会变成var1.n、var1.mean、var1.sd、var2.n、var2.mean、var2.sd。你看到veh组得到6,大概率是var2列的非缺失数,而不是var1的结果。

修正方案

直接指定要统计的列是var1,而不是用.,同时记得给mean和sd加上na.rm=TRUE参数(不然有缺失值时会返回NA):

test <- do.call(data.frame, aggregate(var1 ~ treatment, have, function(x) {
  c(n = sum(!is.na(x)), 
    mean = mean(x, na.rm = TRUE), 
    sd = sd(x, na.rm = TRUE))
}))

运行这段代码后,你应该就能得到预期的结果:veh-9、gr.4-8、gr.3-10、gr.2-5。

更直观的替代方案(推荐)

如果觉得aggregate的嵌套写法容易晕,用dplyr的语法会清晰很多,每一步都明确知道在统计什么:

library(dplyr)

test <- have %>%
  group_by(treatment) %>%
  summarise(
    n = sum(!is.na(var1)),
    mean_var1 = mean(var1, na.rm = TRUE),
    sd_var1 = sd(var1, na.rm = TRUE)
  )

这种写法几乎不会出错,而且可读性极强,以后维护起来也方便。

内容的提问来源于stack exchange,提问作者Jbnimble

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:36:39