Объединение нескольких data.tables в списке в список из двух data.tables - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть функция (слишком длинная, чтобы вставлять ее здесь), которая выведет список, содержащий два элемента, которые оба являются data.tables - назовем их AA и BB. Каждый отдельный data.table всегда будет иметь одинаковое количество столбцов для вызовов функций, но номера строк могут отличаться. AA и BB не имеют совпадающих имен столбцов.

Эта функция будет вызываться несколько раз, и я хочу объединить ('rbind') все таблицы данных AA и BB (отдельно) из вызовов функций в две большие таблицы данных в списке.

Чтобы показать, что я имею в виду, я создал два списка (A и B), каждый из которых содержит две таблицы данных (AA и BB).

require(data.table)

A_1 <- data.table(A = 1:2,B = 2:3)
A_2 <- data.table(C = 100:102,D = 300:302)
A <- list(AA = A_1,BB = A_2)

B_1 <- data.table(A = 2:4,B = 1:3)
B_2 <- data.table(C = 10:12,D = 20:22)
B <- list(AA = B_1,BB = B_2)

Return_list <- function(Name){

  return(get(Name))
}      

Теперь создайте объект «Список», который представляет собой комбинацию списков A и B

List <- lapply(c("A","B"),Return_list)

Мой предполагаемый вывод будет получен следующим образом (в случае, когда я вызывал функцию только дважды):

List_output <- list(AA = rbind(A_1,B_1),BB = rbind(A_2,B_2))

Я рассмотрел множество примеров SO, где data.tables в списке были объединены в один; однако в этом случае я хочу объединить их в две части и не могу применить логику из других примеров.

Я поиграл с rbindlist, unlist (..., recursive = FALSE) и целым рядом других вещей, но, к сожалению, не приблизился.

Любая помощь будет принята с благодарностью. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Мы можем использовать

library(tidyverse)
list(A, B) %>%
   transpose %>% 
   map(bind_rows)

Или с rbindlist из data.table

library(data.table)
Map(function(...) rbindlist(list(...)), A, B)
0 голосов
/ 08 сентября 2018

Вы можете использовать функцию map2 из пакета purrr, чтобы получить то, что вы хотите:

library(purrr)
List_output <- map2(A, B, rbind)

List_output

$`AA`
   A B
1: 1 2
2: 2 3
3: 2 1
4: 3 2
5: 4 3

$BB
     C   D
1: 100 300
2: 101 301
3: 102 302
4:  10  20
5:  11  21
6:  12  22

Или функция Map из базы R:

Map(rbind, A, B)

$`AA`
   A B
1: 1 2
2: 2 3
3: 2 1
4: 3 2
5: 4 3

$BB
     C   D
1: 100 300
2: 101 301
3: 102 302
4:  10  20
5:  11  21
6:  12  22
...