按平均值合并 R 中的多个数据帧(混合数据类型)



我已经对此做了一些研究(在这里和这里(,但我还没有找到我真正想要实现的目标。我找到的最接近我正在寻找的内容在这里,但代码似乎不起作用或做我想要的。此外,我发现rbindlist已被弃用,取而代之的是bind_rows,但我无法使用bind_rows来实现我想要的。

我有一个包含 30 个数据帧的列表,每个数据帧具有相同的行数和列数,以及相同的列数据类型(尽管每列可以是连续的和分类的(。我想将它们合并到具有相同行数和列数的单个数据帧中,但每个单元格分别作为数据帧列表中相应 30 个单元格的平均/中位数/多数投票,分别用于连续列、整数列和分类列。下面是包含三个数据帧的示例:

df 1:
A       B       C
2.3     5       3
12      3       1
0.4     13      2

df_2:
A       B       C
4.3     23      1
1       7       2
0.4     10      2
df_3:
A       B       C
1.3      3      3
2.2      4      2
12.4     10     1

生成的数据帧如下所示:

df_result:
A       B        C
2.63     5       3
5.06     4       2
4.4     10       2

任何关于组合每种数据类型的更适当方法的方向也将不胜感激。

在表上放置一个行 ID

df_1 <- read_table("A       B       C
2.3     5       3
12      3       1
0.4     13      2") %>% 
rowid_to_column("ROW") 

df_2 <- read_table("A       B       C
4.3     23      1
1       7       2
0.4     10      2") %>% 
rowid_to_column("ROW") 
df_3 <- read_table("A       B       C
1.3      3      3
2.2      4      2
12.4     10     1") %>% 
rowid_to_column("ROW")

将它们捆绑在一起

ensamb <- bind_rows(df_1, df_2, df_3)

group_by行,然后按自己的方法汇总每个行

ensamb %>% 
group_by(ROW) %>% 
summarise(A = mean(A), B = median(B), 
C = C[which.max(C)])

# A tibble: 3 x 4
ROW     A     B     C
<int> <dbl> <dbl> <dbl>
1     1  2.63     5     3
2     2  5.07     4     2
3     3  4.4     10     2

您可以将所有数据帧放在一个列表中:

list_df <- mget(ls(pattern = 'df_\d+'))

然后分别计算每列的统计信息。

data.frame(A = Reduce(`+`, lapply(list_df, `[[`, 1))/length(list_df),
B = apply(do.call(rbind, lapply(list_df, `[[`, 2)), 2, median),
C = apply(do.call(rbind, lapply(list_df, `[[`, 3)), 2, Mode), 
row.names = NULL)
#         A  B C
#1 2.633333  5 3
#2 5.066667  4 2
#3 4.400000 10 2

其中Mode函数从这里获取:

Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}

最新更新