按分组聚合计算指定列非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
相关产品推荐
相关产品推荐

