Pie*_*nte 6 r list nested-lists data.table
我想cbind还是unnest或as.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)
我没有测试更一般的情况,但这适用于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)
这是一些超级丑陋的基础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.
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |