gpt4 book ai didi

r - 有效地删除列表和所有子列表中的所有NULL值

转载 作者:行者123 更新时间:2023-12-03 14:52:17 24 4
gpt4 key购买 nike

考虑以下列表:

> l1 <- list(NULL,1,2,list(NULL,3,list(NULL,4)))
> str(l1)
List of 4
$ : NULL
$ : num 1
$ : num 2
$ :List of 3
..$ : NULL
..$ : num 3
..$ :List of 2
.. ..$ : NULL
.. ..$ : num 4


要从第一级删除 NULL值,只需调用

l1[vapply(l1,is.null,logical(1L))] <- NULL


现在,我想删除所有级别的所有 NULL值,我想出了以下代码。

list.clean <- function(.data, fun = is.null, recursive = FALSE) {
if(recursive) {
.data <- lapply(.data, function(.item) {
if(is.list(.item)) list.clean(.item, fun, TRUE)
else .item
})
}
.data[vapply(.data,fun,logical(1L))] <- NULL
.data
}


并打电话

> list.clean(l1, recursive = TRUE)
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[[3]][[1]]
[1] 3

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


尽管目前可以使用,但是有没有更好或更快速的方法呢?

最佳答案

这可以递归地完成:

rmNull <- function(x) {
x <- Filter(Negate(is.null), x)
lapply(x, function(x) if (is.list(x)) rmNull(x) else x)
}
l2 <- rmNull(l1)


给予:

> str(l2)
List of 3
$ : num 1
$ : num 2
$ :List of 2
..$ : num 3
..$ :List of 1
.. ..$ : num 4

关于r - 有效地删除列表和所有子列表中的所有NULL值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25081263/

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