gpt4 book ai didi

删除 NULL 元素并从 R 中的嵌套列表中取消列出本地级别列表

转载 作者:行者123 更新时间:2023-12-02 07:38:23 24 4
gpt4 key购买 nike

假设我有一个列表,假设它有三个级别:

tmp =list(list(list(c(2,9,10), NULL), c(1,3,4,6)), 7) 

这将输出

[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
[1] 2 9 10

[[1]][[1]][[2]]
NULL

[[1]][[2]]
[1] 1 3 4 6

[[2]]
[1] 7

我想删除 NULL 元素和列表的本地级别。即,嵌套列表 tmp 只有 2 层,它变成

tmp =list(list(c(2,9,10), c(1,3,4,6)), 7). 

也就是说,所需的输出如下:

tmp
[[1]]
[[1]][[1]]
[1] 2 9 10

[[1]][[2]]
[1] 1 3 4 6

[[2]]
[1] 7

我尝试搜索 NULL 的索引位置,但没有成功。此外,我不确定如何检测和取消列出列表中包含 NULL 元素的列表。谢谢!

最佳答案

通常,您可以使用以下命令删除平面列表上的 NULL 元素

ll <- list( 1, 2, NULL, 3 )
ll <- ll[ ! sapply(ll, is.null) ]

如果您事先不知道结构,那么将此解决方案与递归函数结合起来是一个明显的情况:

removeNullRec <- function( x ){  
x <- x[ !sapply( x, is.null ) ]
if( is.list(x) ){
x <- lapply( x, removeNullRec)
}
return(x)
}

removeNullRec(tmp)

[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
[1] 2 9 10


[[1]][[2]]
[1] 1 3 4 6


[[2]]
[1] 7

编辑

尽可能简单地重新表述问题总是好的。我从您的评论中了解到的是,(与 NULL 元素的出现无关)您想要用子元素本身替换每个仅包含一个子元素的元素。还有另一种情况必须考虑:两个兄弟叶子也可能为 NULL。让我们从一个更复杂的例子开始:

enter image description here

tree <- list(
list(
list(
list(
list( NULL, NULL ),
list( NULL, NULL )
),
7
),
list(
list(
list( c(1,2), NULL ),
c(3,4)
))))

这个扁平化树的孤立问题当然也可以通过应用递归方法得到最好的解决:

flatTreeRec <- function( x ){
if( is.list(x) ){
# recursion
x <- lapply( x, flatTree )
# remove empty branches
x <- x[ sapply( x, length ) > 0 ]
# flat branches with only child
if( length(x) == 1 ){
x <- x[[1]]
}
}
return(x)
}

flatTreeRec( removeNullRec(tree) )

当然,您可以直接组合这两个函数,以避免对堆栈造成两次压力:

removeNullAndFlatTreeRec <- function( x ){  
x <- x[ !sapply( x, is.null ) ]
if( is.list(x) ){
x <- lapply( x, removeNullRec)
x <- x[ sapply( x, length ) > 0 ]
if( length(x) == 1 ){
x <- x[[1]]
}
}
return(x)
}

removeNullAndFlatTreeRec( tree )

关于删除 NULL 元素并从 R 中的嵌套列表中取消列出本地级别列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24330346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com