我想像这样转换嵌套列表:
l <- list(A=list(a=list(1),b=list(2)),
B=list(cd=list(c=list(3,4,5),d=list(6,7,8)),e=list(c(9,10))))
进入清单
o <- list(A=c(1,2),A.a=1,A.b=2,B=c(3:10),
B.cd=c(3:8),B.cd.c=c(3:5),B.cd.d=c(6:8),B.e=c(9:10))
在每个列表级别,应该连接嵌套列表中的值。
答案 0 :(得分:7)
显然是一个递归函数的情况,但是将返回值正确地取消列表是很棘手的。这是一个可以做到的功能;它没有得到正确的名称,但之后很容易修复。
unnest <- function(x) {
if(is.null(names(x))) {
list(unname(unlist(x)))
}
else {
c(list(all=unname(unlist(x))), do.call(c, lapply(x, unnest)))
}
}
unnest(l)
的输出
$all
[1] 1 2 3 4 5 6 7 8 9 10
$A.all
[1] 1 2
$A.a
[1] 1
$A.b
[1] 2
$B.all
[1] 3 4 5 6 7 8 9 10
$B.cd.all
[1] 3 4 5 6 7 8
$B.cd.c
[1] 3 4 5
$B.cd.d
[1] 6 7 8
$B.e
[1] 9 10
可以使用
按摩到您想要的输出中out <- unnest(l)
names(out) <- sub("\\.*all", "", names(out))
out[-1]
如果只有一个元素,请不要递归,请尝试
unnest2 <- function(x) {
if(is.null(names(x)) | length(x)==1) {
list(unname(unlist(x)))
} else {
c(list(all=unname(unlist(x))), do.call(c, lapply(x, unnest2)))
}
}