使用for循环分别对R中的不同类别执行操作

时间:2017-05-06 03:25:16

标签: 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, 25, 11, 5, 6, 44, 50, 2),
  scale = c( 4, 3, 2, 5, 4, 3, 1, 5)) 

如何使用for循环根据另一列查找其中一列(例如sd)的均值和age值(例如{ {1}})

我已经获得了单独查找平均值和标准偏差的代码,但是想知道是否有办法使用循环代替。

flavor

2 个答案:

答案 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