对 R 中的数据框列表取列均值

Taking column mean over a list of data frames in R

这就是我正在尝试做的事情。我的数据框有一个因子变量 "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)
}

(我不包括第 38 和第 39 列,因为它们是因素。)

我读过这个 (function over more than one list) ,这让我觉得 mapply 是这里的答案...但是我收到了这个错误:

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

可能是我格式不对?

library(dplyr)

df1 %>%
    group_by(country) %>%
    select(-age, -gender) %>%
    summarise_each(funs(mean))

一个data.table答案:

library(data.table)

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

由于用户 Arun

,现在 .SDcols 中取消选择的语法更加简洁

解释这里发生的事情:

  • setDT(df1) 使 data.frame 成为 data.table
  • lapply(.SD, mean) 对于数据子集中的每一列,取 mean
  • by = county 根据 country
  • 分组进行分组
  • .SDcols = -c('age', 'gender') 省略数据子集中的 agegender

如果您坚持将所有内容都放在列表中:

#split and make list of df
myList <- split(df, df$country)

#aggregate without age and gender
my_aggregate <- function(df_inlist) {
  df_inlist <- aggregate(.~country, df_inlist[ , -c(38, 39)], mean)
}

#Apply aggregate function on all data frames in the list
out <- lapply(myList, function (x) {
  my_aggregate(x)
})

out 是每个国家/地区的 list 的 data.frames 和 colmeans 变量。如何将它们放在一起 data.frame :

composite_df <- do.call(rbind, out)

在 base R 中使用 aggregate 很简单,无需事先将 split 和 data.frame 放入列表中。这是一个使用内置虹膜数据的示例,您可以在其中计算除第一列和第二列中的所有变量之外的所有变量的 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

aggregate 中的 . 用于指定您要使用 data.frame 的所有剩余列,但分组变量(在本例中为 Species)除外。并且因为您将 iris[-(1:2)] 指定为输入数据,所以第一列和第二列也未使用。


对于您的数据,它应该类似于:

aggregate(. ~ country, df1[-c(38:39)], mean)