【问题标题】:Summarize means of data frames in a list汇总列表中数据框的均值
【发布时间】:2017-06-23 15:28:09
【问题描述】:

我在一个列表中有一些数据帧,它们都具有相同的结构——在这个例子中是变量 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)
})

我尝试向 dplyr 提供 lst %&gt;% summarize_all(mean),但他不喜欢列表。下面的公式为我提供了列表中每个数据帧的平均值,但还没有给出所有数据帧中这些变量 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)

我怎样才能得到我想要的?

【问题讨论】:

  • 输出应该是什么样的?如果要汇总所有值,可以通过 bind_rows 之类的方式堆叠数据集,然后使用 summarize_all。如果您想取每个数据集的平均值,然后取这些平均值的平均值(如果事情不平衡),您可以使用 purrr 中的map_df 进行每个数据集内的初始循环平均然后在输出上使用summarize_all
  • 谢谢,再次抛出这个奇怪的错误,但@andrew-gustar 的回答带来了解决方案。

标签: r dplyr summarize


【解决方案1】:

你可以用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

【讨论】:

  • 我只需要summarize_all(mean) 那么这正是我想要的。很好的答案谢谢!
  • ...分别t(colMeans(df))
  • 如果您不需要中间结果,则只需 rowMeans(sapply(lst,colMeans))
  • 您是否也使用rowMeans(sapply(lst, colSd)) 来获得完整的SD? (通过使用this 不错的公式。)
  • 不,SD 不能这样工作,部分原因是它不是线性的(作​​为均方偏差的平方根),部分原因是该平均值的每个组成部分都基于每个子样本的平均值,而不是整体平均值。如果您想要按列的整体 sd,则需要将 dfs 绑定在一起,然后获取 sd - 类似于 sapply(do.call(rbind,lst),sd) (或在此将 sd 替换为 mean 以获得与上述相同的整体平均值)。跨度>
猜你喜欢
  • 1970-01-01
  • 2016-06-18
  • 2020-08-22
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多