r - 在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
如果有任何更合适的方法来组合每一个数据类型,我将非常感激。
【回答】:
给你的表加上一个ROW 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)))]
}