如何在保留向量的同时取消列出嵌套列表

时间:2019-02-23 11:06:36

标签: r list vector

我想取消列出一个嵌套列表,其中包含一些作为矢量的项目。问题在于,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循环,但是我想如果列表数量很大,那将会很慢。

有人可以给我一些提示吗?

预先感谢

1 个答案:

答案 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