将列表中的多个 data.tables 组合成两个 data.tables 的列表
Combining multiple data.tables within a list into a list of two data.tables
我有一个函数(太长无法粘贴到此处),它会输出一个包含两个元素的列表,这两个元素都是 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) 和一大堆其他东西,但不幸的是没有接近。
如有任何帮助,我们将不胜感激。提前致谢。
您可以使用 purrr 包中的 map2
函数到达您想去的地方:
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
或者基数 R 中的 Map
函数:
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
我们可以使用
library(tidyverse)
list(A, B) %>%
transpose %>%
map(bind_rows)
或 rbindlist
来自 data.table
library(data.table)
Map(function(...) rbindlist(list(...)), A, B)
我有一个函数(太长无法粘贴到此处),它会输出一个包含两个元素的列表,这两个元素都是 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) 和一大堆其他东西,但不幸的是没有接近。
如有任何帮助,我们将不胜感激。提前致谢。
您可以使用 purrr 包中的 map2
函数到达您想去的地方:
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
或者基数 R 中的 Map
函数:
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
我们可以使用
library(tidyverse)
list(A, B) %>%
transpose %>%
map(bind_rows)
或 rbindlist
来自 data.table
library(data.table)
Map(function(...) rbindlist(list(...)), A, B)