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

时间:2015-05-04 16:55:51

标签: r list dataframe aggregate group-summaries

这就是我想要做的。我的数据框有一个因子变量“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 

也许我的格式不正确?

4 个答案:

答案 0 :(得分:7)

使用aggregate在基础R中直接使用,而无需事先将{。}}数据框放入列表中。以下是使用内置虹膜数据的示例,您可以按split组计算除第一列和第二列之外的所有变量的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 内的.用于指定您要使用除分组变量(本例中为Species)之外的data.frame的所有剩余列。并且因为您将aggregate指定为输入数据,所以也不使用第一列和第二列。

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

iris[-(1:2)]

答案 1 :(得分:6)

library(dplyr)

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

答案 2 :(得分:3)

数据表答案:

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

答案 3 :(得分:3)

如果你坚持要把所有人都列入名单:

#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)