我有一个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)
}
但它不起作用。
请注意: 我相信可以使用更有效和更优雅的方法/脚本,但由于我是初学者,而且非常落后,我有时会尝试继续并在阅读我所拥有的书的相应章节之前应用一些想法。这就是我的方法有时看起来很原始的原因。
答案 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
但实际上,您希望像其他人一样建议使用aggregate
,dplyr
或data.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.table
和dplyr
。
答案 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