R自动Rbind列表中的多个df

R Automatically Rbind multiple df in list

我有一个如下所示的数据框。

set.seed(0L)
AB_df = data.frame(replicate(2,sample(0:130,1624,rep=TRUE)))
BC_df = data.frame(replicate(2,sample(0:130,1656,rep=TRUE)))
DE_df = data.frame(replicate(2,sample(0:130,1656,rep=TRUE)))
FG_df = data.frame(replicate(2,sample(0:130,1729,rep=TRUE)))

df_list = list(AB_df, BC_df, DE_df, FG_df)
names(df_list) = c("AB_df", "BC_df", "DE_df", "FG_df")

set.seed(5)
subs <- 4
df_list =  lapply(df_list, 
                    function(df){
                      idx <- gl(n = subs,round(nrow(df)/subs)) 
                      split(df, sample(idx))})

for (a in 1:length(df_list)) {
  names(df_list[[a]]) = c(paste0("S", seq(1:4)))}

它由嵌套列表组成 "AB_df", "BC_df", "DE_df", "FG_df"。这些嵌套列表中的每一个都包含 4 个样本(S1、S2、S3 和 S4)。

我现在想 rbind 这些样本,但总是遗漏其中一个。因此,对于 df_list$AC_df,我想要 4 个名为 "S1_S2_S3", "S1_S2_S4", "S1_S3_S4", "S2_S3_S4" 的数据帧。所以不想让每个子样本都在自己的数据框中,我想以所有可能的方式组合其中的 3 个。 "S1_S2_S3" 应该包含 df_list$AC_df$S1, df_list$AC_df$S2, df_list$AC and df$S3, 但不包含 df_list$AC_df$S4.

的数据

我尝试创建每个 df 名称的列表并想遍历它们...但我不确定这是个好主意:

level1 = paste("df_list", names(df_list), sep = "$")
samples = c(paste0("S", seq(1:4)))
df_names = paste(rep(level1, each = length(samples)), samples, sep = "$")

idx = c(1:4)
df_names = list (AB = df_names[idx], CD = df_names[idx+4], EF = df_names[idx+8], GH = df_names[idx+12])

更新:

我想我已接近解决方案,但仍然无法正常工作。我试过这个:

save = list()

for (a in 1:length(df_list)) {
  for (b in 1:length(df_list[[a]])) {
    print (b)
    save[[b]] = df_list[[a]][-b]}}

这至少有助于我删除不需要的数据框。但是循环只保存最后一次FG_df...

的结果

考虑使用 combn 呈现三个的所有组合,然后 运行 嵌套 lapply 以连接所需的示例数据帧:

sample_combos <- combn(paste0("S", c(1:4)), 3, simplify=FALSE)

sample_df_list <- lapply(sample_combos, function(s)
                       lapply(df_list, function(lst) do.call(rbind, lst[s]))
                  )

names(sample_df_list) <- lapply(sample_combos, function(s) paste(s, collapse="_"))

Online demo

或者,combn 有一个函数参数:

# UNNAMED LIST OF DFs
sample_combos <- combn(paste0("S", c(1:4)), 3, function(s)
                   lapply(df_list, function(lst) do.call(rbind, lst[s])), 
                       simplify = FALSE
                  )

输出

sample_combos
# List of 4
# $ S1_S2_S3:List of 4
# ..$ AB_df:'data.frame':   1218 obs. of  2 variables:
#   .. ..$ X1: int [1:1218] 117 118 82 100 27 85 16 50 63 64 ...
# .. ..$ X2: int [1:1218] 12 122 103 90 45 69 34 7 129 10 ...
# ..$ BC_df:'data.frame':   1242 obs. of  2 variables:
#   .. ..$ X1: int [1:1242] 69 47 48 53 11 0 55 101 128 112 ...
# .. ..$ X2: int [1:1242] 35 96 18 75 103 98 118 27 37 122 ...
# ..$ DE_df:'data.frame':   1242 obs. of  2 variables:
#   .. ..$ X1: int [1:1242] 115 67 53 40 118 114 75 127 42 32 ...
# .. ..$ X2: int [1:1242] 117 25 101 106 12 73 88 92 65 5 ...
# ..$ FG_df:'data.frame':   1297 obs. of  2 variables:
#   .. ..$ X1: int [1:1297] 125 32 83 12 120 44 11 22 63 26 ...
# .. ..$ X2: int [1:1297] 43 30 78 53 102 103 121 111 27 100 ...
# $ S1_S2_S4:List of 4
# ..$ AB_df:'data.frame':   1218 obs. of  2 variables:
#   .. ..$ X1: int [1:1218] 117 118 82 100 27 85 16 50 63 64 ...
# .. ..$ X2: int [1:1218] 12 122 103 90 45 69 34 7 129 10 ...
# ..$ BC_df:'data.frame':   1242 obs. of  2 variables:
#   .. ..$ X1: int [1:1242] 69 47 48 53 11 0 55 101 128 112 ...
# .. ..$ X2: int [1:1242] 35 96 18 75 103 98 118 27 37 122 ...
# ..$ DE_df:'data.frame':   1242 obs. of  2 variables:
#   .. ..$ X1: int [1:1242] 115 67 53 40 118 114 75 127 42 32 ...
# .. ..$ X2: int [1:1242] 117 25 101 106 12 73 88 92 65 5 ...
# ..$ FG_df:'data.frame':   1297 obs. of  2 variables:
#   .. ..$ X1: int [1:1297] 125 32 83 12 120 44 11 22 63 26 ...
# .. ..$ X2: int [1:1297] 43 30 78 53 102 103 121 111 27 100 ...
# $ S1_S3_S4:List of 4
# ..$ AB_df:'data.frame':   1218 obs. of  2 variables:
#   .. ..$ X1: int [1:1218] 117 118 82 100 27 85 16 50 63 64 ...
# .. ..$ X2: int [1:1218] 12 122 103 90 45 69 34 7 129 10 ...
# ..$ BC_df:'data.frame':   1242 obs. of  2 variables:
#   .. ..$ X1: int [1:1242] 69 47 48 53 11 0 55 101 128 112 ...
# .. ..$ X2: int [1:1242] 35 96 18 75 103 98 118 27 37 122 ...
# ..$ DE_df:'data.frame':   1242 obs. of  2 variables:
#   .. ..$ X1: int [1:1242] 115 67 53 40 118 114 75 127 42 32 ...
# .. ..$ X2: int [1:1242] 117 25 101 106 12 73 88 92 65 5 ...
# ..$ FG_df:'data.frame':   1296 obs. of  2 variables:
#   .. ..$ X1: int [1:1296] 125 32 83 12 120 44 11 22 63 26 ...
# .. ..$ X2: int [1:1296] 43 30 78 53 102 103 121 111 27 100 ...
# $ S2_S3_S4:List of 4
# ..$ AB_df:'data.frame':   1218 obs. of  2 variables:
#   .. ..$ X1: int [1:1218] 75 8 26 23 50 65 35 50 44 78 ...
# .. ..$ X2: int [1:1218] 1 11 5 67 11 4 75 118 43 93 ...
# ..$ BC_df:'data.frame':   1242 obs. of  2 variables:
#   .. ..$ X1: int [1:1242] 103 7 116 17 88 111 77 8 108 50 ...
# .. ..$ X2: int [1:1242] 76 118 97 80 53 121 21 115 106 5 ...
# ..$ DE_df:'data.frame':   1242 obs. of  2 variables:
#   .. ..$ X1: int [1:1242] 109 49 94 58 80 111 71 80 78 115 ...
# .. ..$ X2: int [1:1242] 89 16 120 107 67 16 17 87 53 19 ...
# ..$ FG_df:'data.frame':   1297 obs. of  2 variables:
#   .. ..$ X1: int [1:1297] 99 112 100 127 26 11 64 23 29 8 ...
# .. ..$ X2: int [1:1297] 58 4 20 114 0 24 93 0 124 47 ...