这就是我想要做的。我的数据框有一个因子变量“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
也许我的格式不正确?
答案 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')
忽略数据子集中的age
和gender
列答案 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)