R:在类似数据帧的列表上应用函数

时间:2015-06-27 03:32:24

标签: r list dataframe mean

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。

2 个答案:

答案 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=TRUEarray一起使用

 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的解决方案非常紧凑和优雅。