![](/img/trans.png)
[英]create columns in dataframe from nested list of dataframes in a dataframe column
[英]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
我已经用purrr
和reduce
和map
做了一些尝试,但没有成功。 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 的解决方案那么简洁,但它可以通过在summarize
和across
调用中设置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.