使用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