9阅网

您现在的位置是:首页 > 知识 > 正文

知识

r - 在R中按平均数组合多个数据帧(混合数据类型)。

admin2022-11-01知识18

我对此做了一些研究(此处此处),但我还没有找到我真正想要实现的东西。我发现最接近我所寻找的东西是 此处但代码似乎并没有工作,也没有达到我想要的效果。此外,我发现 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)))]
}