计算数据框中每列的平均值和标准差等值的最佳方法是什么? 例如,如果我有一个数据框:
s <- data.frame(
sample = c("s_1", "s_2", "s_3", "s_4", "s_5", "s_6", "s_7", "s_8"),
flavor = c("original", "chicken", "original", "original", "cheese", "chicken", "cheese", "original"),
age = c(23, 25, 11, 5, 6, 44, 50, 2),
scale = c( 4, 3, 2, 5, 4, 3, 1, 5))
如何使用for
循环根据另一列查找其中一列(例如sd
)的均值和age
值(例如{ {1}})
我已经获得了单独查找平均值和标准偏差的代码,但是想知道是否有办法使用循环代替。
flavor
答案 0 :(得分:1)
如果我们需要for
循环,那么循环遍历'flavor'的unique
元素,根据'flavor'的值对'age'进行子集化并得到{{1}并且每个类别的sd`都包含在向量'v1'
mean
我们不是最初创建一个NULL向量(v1 <- c()
for(un1 in unique(s$flavor)){
tmp <- s$age[s$flavor == un1]
v1 <- c(v1, paste("mean =", mean(tmp), "sd =", sd(tmp)))
}
v1
#[1] "mean = 10.25 sd = 9.28708781050335" "mean = 34.5 sd = 13.4350288425444"
#[3] "mean = 28 sd = 31.1126983722081"
),而是预先分配一个长度等于'flavor'中唯一元素长度的向量(应该比上面的效率更高)
v1 <- c()
在循环内部将'v1&lt; - '更改为
v1 <- numeric(length(unique(s$flavor)))
但是这可以通过nm1 <- unique(s$flavor)
for(i in seq_along(unique(s$flavor))){
tmp <- s$age[s$flavor == nm1[i] ]
v1[i] <-paste("mean =", mean(tmp), "sd =", sd(tmp))
}
base R
或do.call(data.frame, aggregate(age~flavor, s, FUN = function(x) c(Mean = mean(x), SD= sd(x))))
data.table
答案 1 :(得分:0)
由于循环效率不高,您可以使用像Patronus建议的dplyr或使用plyr,如下所示:
require(plyr)
s.summary <- ddply(s, c("flavor"), summarise,
N= length(age),
mean= round(mean(age),2),
sd= round(sd(age),2),
se = round(sd/sqrt(N),2)
)
s.summary