在 R 中的一组数据帧上循环 merge+sum 函数

Loop a merge+sum function on a set of dataframes in R

我有以下数据集列表:

dflist <- list(df1_A, df1_B, df1_C, df1_D, df1_E,
               df2_A, df2_B, df2_C, df2_D, df2_E,
               df3_A, df3_B, df3_C, df3_D, df3_E,
               df4_A, df4_B, df4_C, df4_D, df4_E)

names(dflist) <- c("df1_A", "df1_B", "df1_C", "df1_D", "df1_E",
                   "df2_A", "df2_B", "df2_C", "df2_D", "df2_E",
                   "df3_A", "df3_B", "df3_C", "df3_D", "df3_E",
                   "df4_A", "df4_B", "df4_C", "df4_D", "df4_E")

每个数据框都具有相同的结构(具有相同的列名):

df1_A
    V1  V2
G18941  17
G20092 534
G19692  10
G19703 260
G16777 231
G20045   0
...

我想创建一个函数,合并列表中所有具有相同数字(但字母不同)的数据帧,并在 V1 中的名称相同时对 V2 列中的值求和。

在困难中,我设法使用以下代码为 df1_A 和 df1_B 做到了这一点:

newdf <- bind_rows(df1_A, df1_B) %>%
  group_by(V1) %>%
  summarise_all(., sum, na.rm = TRUE)

我可以轻松地将它变成这样的函数:

MergeAndSum <- function(df1,df2) 
newdf <- bind_rows(df1, df2) %>%
  group_by(V1) %>%
  summarise_all(., sum, na.rm = TRUE)
return(newdf)

但我真的不知道如何调用它来执行循环。我尝试类似的东西:

for (i in 2:length(dflist)){
  df1 <- List_RawCounts_Files[i-1]
  df2 <- List_RawCounts_Files[i]
  out1 <- MergeAndSum(df1,df2)
return(out1)
}

我想象一些东西将 df1_A 合并+求和到 df1_B 并将结果重新分配给 df1_A,然后用 df1_A 和 [= 回调函数39=] 并将结果重新赋值给 df1_A,然后用 df1_A 和 df1_D 回调函数,并将结果重新赋值给 df1_A,然后用 df1_A 和 df1_E

然后 df2 (df2_A, df2_B,... df2_E), 然后 df3, df4 和 df5.

如果你知道怎么做,我正在听。

bind_rows 可以将数据帧列表组合在一起。您可以将它们与 id 列组合,以便将列表的名称添加为新列,提取数据框名称(df1 来自 df1_Adf2 来自 df2_A 等等)并将每个数据框的 V2 列和 V1 列的总和作为组。

library(dplyr)

bind_rows(dflist, .id = "id") %>%
  mutate(id = stringr::str_extract(id, 'df\d+')) %>%
  group_by(id, V1) %>%
  summarise(V2 = sum(V2, na.rm = TRUE), .groups = "drop")

由于您只想 sum 一栏 (V2),您可以使用 summarise 而不是 summarise_all,后者已被取代。