df1 <- data.frame(Profit=c(7,2,8), CSR=c(1, 5, 9), row.names = c("A", "B", "C"))
df2 <- data.frame(Profit=c(13,4,2), CSR=c(4, 2, 8), row.names = c("A", "B", "C"))
df3 <- data.frame(Profit=c(6,2,5), CSR=c(3, 8, 20), row.names = c("A", "B", "C"))
l<-list(df1, df2, df3)
l
dfmean<- data.frame(Profit=c(9,3,5), CSR=c(2, 6, 13), row.names = c("A", "B", "C"))
dfmean
我想在存储在列表中的所有三个(或更多)数据帧上调用一个函数(这里:mean),返回组合在一个数据帧中的那些数据帧。在这种情况下,它应该看起来像dfmean。
答案 0 :(得分:7)
您可以使用Reduce("+", l)
添加它们,然后将该总和除以数据帧的总数。
Reduce("+", l) / length(l)
# Profit CSR
# A 8.666667 2.666667
# B 2.666667 5.000000
# C 5.000000 12.333333
答案 1 :(得分:1)
在大型数据集中,我怀疑某些缺失值(NA
)。在这种情况下,您可以在转换为mean
后将na.rm=TRUE
与array
一起使用
apply(array(unlist(l), c(3,2,3)),c(1,2), mean, na.rm=TRUE)
# [,1] [,2]
#[1,] 8.666667 2.666667
#[2,] 2.666667 5.000000
#[3,] 5.000000 12.333333
或使用rowMeans
apply(array(unlist(l), c(3, 2, 3)), 2, rowMeans, na.rm=TRUE)
# [,1] [,2]
#[1,] 8.666667 2.666667
#[2,] 2.666667 5.000000
#[3,] 5.000000 12.333333
或者使用dplyr/tidyr
,我们unnest
list
('l'),创建分组变量'n',然后使用summarise_each
library(dplyr)
library(tidyr)
unnest(l, gr) %>%
group_by(gr) %>%
group_by(n=row_number()) %>%
summarise_each(funs(mean(., na.rm=TRUE)), Profit:CSR)
# n Profit CSR
#1 1 8.666667 2.666667
#2 2 2.666667 5.000000
#3 3 5.000000 12.333333
如果没有NAs,我认为@ josilber的解决方案非常紧凑和优雅。