如何在for循环中使用tapply

时间:2015-02-26 21:33:44

标签: r

我有一个data.frame“df”,它有200个观察值和18列。 18列是var1,var2等.... 当我使用时:

tapply(df$var1, INDEX=df$varX, FUN=mean, na.rm=T)

其中varX是string类型的某个变量(var)的固定值,我得到varX的每个值的var1的平均值。 我的问题是: 我怎样才能将上面的命令放在for循环中,以便它会迭代相同的命令,使它覆盖所有变量(var1,var2,...等),当然varX除外? 我试过这个:

for (k in c(var1, var2, ..., varn)) {
tapply(df$k, INDEX=df$varX, FUN=mean, na.rm=T)
}

但它不起作用。

请注意: 我相信可以使用更有效和更优雅的方法/脚本,但由于我是初学者,而且非常落后,我有时会尝试继续并在阅读我所拥有的书的相应章节之前应用一些想法。这就是我的方法有时看起来很原始的原因。

3 个答案:

答案 0 :(得分:1)

您正在寻找的最直接的改编(使用iris作为示例数据框)是:

for(k in iris[-5])   # we loop through the columns in `iris`, except last
  print(tapply(k, INDEX=iris$Species, FUN=mean, na.rm=T))

产生:

setosa versicolor  virginica 
 5.006      5.936      6.588 
setosa versicolor  virginica 
 3.428      2.770      2.974 
setosa versicolor  virginica 
 1.462      4.260      5.552 
setosa versicolor  virginica 
 0.246      1.326      2.026 

使用sapply代替for稍微优雅一点:

sapply(iris[-5], tapply, INDEX=iris$Species, mean, na.rm=T)

产生:

           Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa            5.006       3.428        1.462       0.246
versicolor        5.936       2.770        4.260       1.326
virginica         6.588       2.974        5.552       2.026

但实际上,您希望像其他人一样建议使用aggregatedplyrdata.table

data.table(iris)[, lapply(.SD, mean, na.rm=TRUE), by=Species]
iris %>% group_by(Species) %>% summarise_each(funs(mean(., na.rm=TRUE)))
aggregate(. ~ Species, iris, mean, na.rm = TRUE) # Courtesy David Arenburg

第一个要求分别加载包data.tabledplyr

答案 1 :(得分:1)

library(dplyr)
df %>%
na.omit() %>%
group_by(varX) %>%
summarise_each(funs(mean))

答案 2 :(得分:1)

你可以使用rowsum(),它是最快的基础R聚合函数之一(虽然在这里我们需要将它除以分组变量的计数来得到均值)。

按照BrodieG的示例使用按data(iris)分组的Species,我们可以

grp <- iris$Species
rowsum(iris[-5], grp, na.rm = TRUE) / tabulate(grp, nlevels(grp))
#            Sepal.Length Sepal.Width Petal.Length Petal.Width
# setosa            5.006       3.428        1.462       0.246
# versicolor        5.936       2.770        4.260       1.326
# virginica         6.588       2.974        5.552       2.026
相关问题