将列表中的多个data.tables合并为两个data.tables的列表

时间:2018-09-08 14:42:59

标签: r list data.table rbind

我有一个函数(太长,无法在此处粘贴),该函数将输出一个包含两个元素的列表,这两个元素都是data.tables-我们将其称为AA和BB。每个单独的data.table始终具有相同数量的列用于函数调用,但是行号可能不同。 AA和BB没有匹配的列名。

此函数将被多次调用,我想将函数调用中的所有AA和BB data.tables(分别)合并(“ rbind”)为列表中的两个更大的data.tables。

为了说明我的意思,我创建了两个列表(A和B),每个列表包含两个data.tables(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))
}      

现在创建对象“ List”,它是列表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 :(得分:2)

我们可以使用

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

或者使用rbindlist中的data.table

library(data.table)
Map(function(...) rbindlist(list(...)), A, B)

答案 1 :(得分:1)

您可以使用purrr软件包中的event.preventDefault(); 函数到达您想要的位置:

map2

或者是基数R中的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