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)
也许我的格式不正确?
在基本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)
library(dplyr)
df1 %>%
group_by(country) %>%
select(-age, -gender) %>%
summarise_each(funs(mean))
Run Code Online (Sandbox Code Playgroud)
数据表答案:
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.tablelapply(.SD, mean)对于数据子集中的每一列,取meanby = county通过按组划分来执行此操作country.SDcols = -c('age', 'gender')省略数据子集中的age和列gender| 归档时间: |
|
| 查看次数: |
3366 次 |
| 最近记录: |