从数据框列表中创建平均值数据框。

3

我有一个包含超过6000个数据框的列表,每个数据框都有大约2000个变量的6000个观测值。我想要计算一个6000x2000的平均数据框,其中每个值都是该位置在所有数据框中的平均值(例如:mean.df[1,1] = mean(df1[1,1],df2[1,1],df3[1,1],.....dfN[1,1])

我准备了一个简短的示例来说明我的需求。

# Build list of dataframes
df.X <- data.frame("A1" = seq(1,5,1), "A2" = seq(2,10,2) , "A3" = seq(10,18,2))
df.Y <- data.frame("B1" = seq(0,8,2), "B2" = seq(4,8,1) , "B3" = seq(10,18,2))
df.Z <- data.frame("C1" = seq(2,10,2), "C2" = 1:5 , "C3" = seq(10,18,2))
df.list <- list(df.X,df.Y,df.Z)

#Desired output
m1  M2  M3 
1.0 2.3 10.0
2.7 3.7 12.0
4.3 5.0 14.0
6.0 6.3 16.0
7.7 7.7 18.0

我曾尝试使用purrrreducemap,但没有成功。也许应该使用apply函数?

提前感谢。

3个回答

2

另一种选择是将其转换为array并使用colMeans

apply(array(unlist(df.list), c(dim(df.list[[1]]), length(df.list))), 2, rowMeans)

-输出

          [,1]     [,2] [,3]
[1,] 1.000000 2.333333   10
[2,] 2.666667 3.666667   12
[3,] 4.333333 5.000000   14
[4,] 6.000000 6.333333   16
[5,] 7.666667 7.666667   18

你可以使用meanMARGIN = c(1,2)代替带有MARGIN = 2rowMeans或带有MARGIN = 1colMeans(请参见apply的文档)。至少在我看来,这种方法更加直观,可以计算行(1)和列(2)的平均值。 - Brzoskwinia
你知道为什么它更快吗?我没有测试过,也不想深入文档了解,但如果你现在知道答案,请解释一下。 - Brzoskwinia
@Brzoskwinia 为了检查效率,您可以在更大的数据集上使用 microbenchmark。我猜 rowMeans 会更快,因为我们在单个 MARGIN 循环时减少了迭代次数。 - akrun

1

基本R
将列表中的所有元素相加,然后除以元素数量。 不适用于NA元素!

Reduce(`+`, df.list) / length(df.list)

        A1       A2 A3
1 1.000000 2.333333 10
2 2.666667 3.666667 12
3 4.333333 5.000000 14
4 6.000000 6.333333 16
5 7.666667 7.666667 18

所有需要做的就是设置列名。

0
一个 tidyverse 的解决方案。我们可以将所有数据框组合起来,通过每个 Group 创建一个 ID 列,并计算平均值。这个解决方案不像 Wimpel 的解决方案那样简洁,但是它可以通过在 summarizeacross 调用中设置 na.rm = TRUE 来处理缺失值。
library(tidyverse)

df_mean <- df.list %>%
  map_dfr(~setNames(.x, paste0("A", 1:ncol(.x))), .id = "Group") %>%
  group_by(Group) %>%
  mutate(ID = 1:n()) %>%
  group_by(ID) %>%
  summarize(across(-Group, .fns = mean, na.rm = TRUE)) %>%
  select(-ID)
# # A tibble: 5 x 3
#    A1    A2    A3
#    <dbl> <dbl> <dbl>
# 1  1     2.33    10
# 2  2.67  3.67    12
# 3  4.33  5       14
# 4  6     6.33    16
# 5  7.67  7.67    18

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接