我已经对此做了一些研究(在这里和这里(,但我还没有找到我真正想要实现的目标。我找到的最接近我正在寻找的内容在这里,但代码似乎不起作用或做我想要的。此外,我发现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)))]
}