在R中的数据帧列表中取列均值

Ans*_*ica 7 aggregate r list group-summaries dataframe

这就是我想要做的.我的数据框有一个因子变量"country",我想根据国家/地区拆分数据框.然后,我想对每个国家/地区的数据框的每个变量采用列均值.

数据在这里:https://github.com/pourque/country-data

到目前为止我已经这样做了......

myList <- split(df1, df1$country)
for(i in 1:length(myList)) {
aggregate <- mapply(myList[[i]][,-c(38:39)], colMeans)
}
Run Code Online (Sandbox Code Playgroud)

(我不包括第38和第39列,因为这些是因素.)

我已经读过这个(多个列表中的函数),这让我觉得mapply就是这里的答案......但是我收到了这个错误:

Error in match.fun(FUN) : 
'myList[[i]][, -c(38:39)]' is not a function, character or symbol 
Run Code Online (Sandbox Code Playgroud)

也许我的格式不正确?

tal*_*lat 7

在基本R中使用它是直接的,aggregate而不需要split事先将data.frame放入列表中.下面是使用内置虹膜数据的示例,您可以mean按以下组计算除第一列和第二列之外的所有变量Species:

data(iris)
aggregate(. ~ Species, iris[-(1:2)], mean)
#     Species Petal.Length Petal.Width
#1     setosa        1.462       0.246
#2 versicolor        4.260       1.326
#3  virginica        5.552       2.026
Run Code Online (Sandbox Code Playgroud)

.内部aggregate用于指定要使用data.frame的所有剩余列,除了分组变量(物种在这种情况下).并且因为您指定iris[-(1:2)]为输入数据,所以也不使用第一列和第二列.


对于您的数据,它应该是这样的:

aggregate(. ~ country, df1[-c(38:39)], mean)
Run Code Online (Sandbox Code Playgroud)


Gre*_*gor 6

library(dplyr)

df1 %>%
    group_by(country) %>%
    select(-age, -gender) %>%
    summarise_each(funs(mean))
Run Code Online (Sandbox Code Playgroud)


arv*_*000 4

数据表答案:

library(data.table)

setDT(df1)[, lapply(.SD, mean), by = country, .SDcols = -c('age', 'gender')]
Run Code Online (Sandbox Code Playgroud)

现在语法更加整洁,在 .SDcols 中取消选择,感谢用户 Arun

解释一下这里发生的事情:

  • setDT(df1)使 data.frame 成为 data.table
  • lapply(.SD, mean)对于数据子集中的每一列,取mean
  • by = county通过按组划分来执行此操作country
  • .SDcols = -c('age', 'gender')省略数据子集中的age和列gender