带有部分嵌套列表的cbind

Pie*_*nte 6 r list nested-lists data.table

我想cbind还是unnestas.data.table部分嵌套列表.

id <- c(1,2)
A <- c("A1","A2","A3")
B <- c("B1")
AB <- list(A=A,B=B)
ABAB <- list(AB,AB)
nested_list <- list(id=id,ABAB=ABAB)
Run Code Online (Sandbox Code Playgroud)

lengthID的相同ABAB(2在这种情况下).我不知道unlist该列表的一部分(ABAB)和cbind另一部分(id).这是我想要的结果data.table:

data.table(id=c(1,1,1,2,2,2),A=c("A1","A2","A3","A1","A2","A3"),B=rep("B1",6))
   id  A  B
1:  1 A1 B1
2:  1 A2 B1
3:  1 A3 B1
4:  2 A1 B1
5:  2 A2 B1
6:  2 A3 B1
Run Code Online (Sandbox Code Playgroud)

edd*_*ddi 6

我没有测试更一般的情况,但这适用于OP示例:

library(data.table)

as.data.table(nested_list)[, lapply(ABAB, as.data.table)[[1]], id]
#   id  A  B
#1:  1 A1 B1
#2:  1 A2 B1
#3:  1 A3 B1
#4:  2 A1 B1
#5:  2 A2 B1
#6:  2 A3 B1
Run Code Online (Sandbox Code Playgroud)

或另一种选择(可能更快,但更详细):

rbindlist(lapply(nested_list$ABAB, as.data.table),
          idcol = 'id')[, id := nested_list$id[id]]
Run Code Online (Sandbox Code Playgroud)


lmo*_*lmo 5

这是一些超级丑陋的基础R,但产生了所需的输出.

Reduce(rbind, Map(function(x, y) setNames(data.frame(x, y), c("id", "A", "B")),
                  as.list(nested_list[[1]]),
                  lapply(unlist(nested_list[-1], recursive=FALSE),
                         function(x) Reduce(cbind, x))))
  id  A  B
1  1 A1 B1
2  1 A2 B1
3  1 A3 B1
4  2 A1 B1
5  2 A2 B1
6  2 A3 B1
Run Code Online (Sandbox Code Playgroud)

lapply获取用unlist和提取的两个元素的列表(每个元素包含A和B变量)recursive=FALSE.它返回一个字符矩阵列表,其中B变量通过循环填充.将来自as.list(nested_list[[1]])矩阵的单个id变量列表和矩阵点亮Map,将相应的对转换为data.frame,并为列提供所需的名称,并返回data.frames列表.最后,这个data.frames列表被送到Reduce,rbind结果是单个data.frame.

如果需要,决赛Reduce(rbind, 可以用data.tables 代替rbindlist.