在 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_A
,df2
来自 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
,后者已被取代。
我有以下数据集列表:
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_A
,df2
来自 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
,后者已被取代。