繁体   English   中英

从数据框列表创建平均数据框

[英]Create mean dataframe from a list of dataframes

我有一个包含 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做了一些尝试,但没有成功。 Mabye 申请?

提前致谢

基础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

剩下要做的就是设置列名。

一个选项也是转换为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

一个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM