我想取消列出一个嵌套列表,其中包含一些作为矢量的项目。问题在于,unlist也会拆分这些向量。如何将它们作为单个物品保存?
a)向上一级(unlist参数:递归= F)
b)所有级别(unlist参数:递归= T)
这里是例子:
list0 <- list(c(1,2),
list(3,
c(4,5)
)
)
> list0
[[1]]
[1] 1 2
[[2]]
[[2]][[1]]
[1] 3
[[2]][[2]]
[1] 4 5
如果我们取消列出一个级别:
list1 <- unlist(list0, recursive = F)
我们得到:
> list1
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
[1] 4 5
但是,由于我想保持向量原样,所以我想要得到:
[[1]]
[1] 1 2
[[2]]
[1] 3
[[3]]
[1] 4 5
也许一种方法是使用for循环,但是我想如果列表数量很大,那将会很慢。
有人可以给我一些提示吗?
预先感谢
答案 0 :(得分:1)
对于您的示例,下面的代码给出了预期的结果。
f <- function(x){
if(is.atomic(x)){
list(x)
}else{
x
}
}
unlist(lapply(list0, f), recursive=FALSE)
但是也许您需要一些可以嵌套更多级别的东西,例如:
f <- function(x){
if(is.atomic(x)){
list(x)
}else{
x
}
}
g <- function(L){
out <- unlist(lapply(L, f), recursive=FALSE)
while(any(sapply(out, is.list))){
out <- g(out)
}
out
}
list1 <- list(c(1,2),
list(3, c(4,5)),
list(6, list(c(7,8)))
)
list1_flattened <- g(list1)
给出:
> list1
[[1]]
[1] 1 2
[[2]]
[[2]][[1]]
[1] 3
[[2]][[2]]
[1] 4 5
[[3]]
[[3]][[1]]
[1] 6
[[3]][[2]]
[[3]][[2]][[1]]
[1] 7 8
> list1_flattened
[[1]]
[1] 1 2
[[2]]
[1] 3
[[3]]
[1] 4 5
[[4]]
[1] 6
[[5]]
[1] 7 8