使用for循环分别对R中的不同类别执行操作
计算数据框中每列的平均值和标准偏差等值的最佳方法是什么? 例如,如果我有一个数据帧:使用for循环分别对R中的不同类别执行操作,r,loops,for-loop,dataframe,R,Loops,For Loop,Dataframe,计算数据框中每列的平均值和标准偏差等值的最佳方法是什么? 例如,如果我有一个数据帧: 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, 2
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循环,那么循环“flavor”的唯一元素,根据“flavor”的值对“age”进行子集划分,并获得要包含在向量“v1”中的每个类别的平均值和sd
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"
或者使用data.table更有效的方法
由于循环效率不高,您可以使用dplyr,如Patronus建议的那样,或使用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
因此,我不必为每个类别编写三个略有不同的代码。请尝试改用dplyr:librarydplyr,然后s%>%groupbyflavor%>%summaryMean=meanage,sd=sdage可能重复的
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))
}
do.call(data.frame, aggregate(age~flavor, s, FUN = function(x) c(Mean = mean(x), SD= sd(x))))
library(data.table)
setDT(s)[, paste("mean =", mean(age), "sd =", sd(age)), flavor]$V1
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