2017-06-23 28 views
0

我有一个列表中的所有数据帧都具有相同的结构 - 在本例中为变量a,b和c。现在我想总结整个列表中值的方法。总结列表中的数据帧的方法

# list of 10 random data frames 
n <- 1e1 
initSeed <- 1234 
set.seed(initSeed) 
(seedVec <- sample.int(n = 1e3, size = n, replace = FALSE)) 
lst <- lapply(1:n, function(i){ 
    set.seed(seedVec[i]) 
a <- rnorm(24,1,.1) 
b <- rnorm(24,2,.2) 
c <- rnorm(24,3,.3) 
df <- data.frame(a,b,c) 
}) 

我试图用lst %>% summarize_all(mean)养活dplyr但他不会像列表。下面的公式给出了列表中每个数据帧的含义,但是并不是所有数据帧中这些变量a,b和c的含义。

lapply(1:10, function(n){ 
    lst[n] %>% 
    data.frame() %>% 
    summarize_all(mean) 
}) 

,所以我想做出一个新的数据帧与总结输出,以便再次总结一下他们,但失败和我的扩展配方和related answer都被扔Error in lst[[idx]] : subscript out of bounds 这里是我的尝试:

df1 <- as.data.frame(setNames(replicate(3,numeric(0), simplify = FALSE), 
           letters[1:3])) 
lapply(1:10, function(n){ 
    lst[n] %>% 
    data.frame() %>% 
    summarize_all(mean) %>% 
    rbind(df1, lst[n]) 
}) 

df1 %>% summarize_all(mean) 

我怎么能得到我想要的?

+1

什么应该输出什么样子?如果你想汇总所有的值,你可以通过类似'bind_rows'的方式堆叠数据集,然后使用'summarize_all'。如果你想采用每个数据集的平均值,然后采用这些平均值(如果事情不平衡),可以使用* purrr *中的map_df来进行每个数据集中的初始循环平均,然后使用summarize_all在输出上。 – aosmith

+0

谢谢,再次抛出这个奇怪的错误,但来自@ andrew-gustar的答案带来了解决方案。 – jaySf

回答

2

您可以purrr

purrr::map_df(lst, function(df){summarize_all(df,mean)}) 

      a  b  c 
1 0.9917488 1.995821 3.121970 
2 1.0007174 2.029938 2.962271 
3 0.9582000 2.007167 3.046708 
4 0.9745993 1.938877 3.015066 
5 1.0050672 1.932359 3.052645 
6 1.0196390 2.034723 2.998995 
7 0.9717243 1.914532 3.024200 
8 0.9954225 1.991664 2.981958 
9 1.0148424 1.975775 2.949854 
10 1.0014377 2.023839 2.976223 

还是在基础R做到这一点...

t(sapply(lst,colMeans)) 
       a  b  c 
[1,] 0.9917488 1.995821 3.121970 
[2,] 1.0007174 2.029938 2.962271 
[3,] 0.9582000 2.007167 3.046708 
[4,] 0.9745993 1.938877 3.015066 
[5,] 1.0050672 1.932359 3.052645 
[6,] 1.0196390 2.034723 2.998995 
[7,] 0.9717243 1.914532 3.024200 
[8,] 0.9954225 1.991664 2.981958 
[9,] 1.0148424 1.975775 2.949854 
[10,] 1.0014377 2.023839 2.976223 
+0

我只需要'summarize_all(mean)',那么这正是我想要的。很好的回答谢谢! – jaySf

+0

...分别表示(colMeans(df))'。 – jaySf

+1

或者只是'rowMeans(sapply(lst,colMeans))''如果你不需要中间结果。 –