使用tapply计算数据框列均值异常,请求技术帮助
问题排查与解决
为什么你的代码会输出大量结果
你用tapply(df$s1, df$s1, mean)时,第二个参数是分组依据——你把s1的每个数值都当成一个分组,相当于每个数据点单独成组,每组的均值就是它自己,所以会输出和s1长度一样的结果,完全不是你要的整列均值。
正确的实现方式
最简便的方法:用colMeans
colMeans是R里专门计算数据框每列均值的函数,直接用就行:
x <- seq(1,100) s1 <- dnorm(x, mean = 61, sd = 63) s2 <- dnorm(x, mean = 38, sd = 5) s3 <- dnorm(x, mean = 355, sd = 58) df <- data.frame(s1,s2,s3) # 直接计算每列均值 means <- colMeans(df)
非要用tapply的话这么写
tapply是对向量按分组计算,要算整列均值,得把所有数据归为同一个分组:
# 计算单列s1的均值 mean_s1 <- tapply(df$s1, rep(1, nrow(df)), mean) # 批量计算三列的均值 means <- sapply(df, function(col) tapply(col, rep(1, length(col)), mean))
额外提醒
你生成的s3因为均值355远大于x的范围(1-100),所以所有s3的数值都极小(接近0),最终均值也会趋近于0,这是正态分布的特性,不是代码错误。
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

