R автоматически Rbind несколько DF в списке - PullRequest
1 голос
/ 15 октября 2019

У меня есть датафрейм, подобный приведенному ниже.

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).

Я хочу привязать эти сэмплы сейчас, но всегда оставляю один из них. Поэтому для 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 ...

1 Ответ

1 голос
/ 15 октября 2019

Рассмотрите возможность рендеринга всех комбинаций из трех с 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="_"))

Демонстрационная версия

В качестве альтернативы, 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 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...