我有一个任意嵌套的列表(没有规则)。我需要将NULL
值替换为NA
,并且列表的结构必须保持原样。
最小工作示例:
myList <- list("elem1" = "first",
"elem2" = list("elem2.1" = "second1",
"elem2.2" = NULL),
"elem3" = list("elem3.1" = "third1",
"elem3.2" = list("elem3.2.1" = NULL,
"elem3.2.2" = NULL,
"elem3.2.3" = "third2.3"),
"elem4" = "fourth"))
输出:
$elem1
[1] "first"
$elem2
$elem2$elem2.1
[1] "second1"
$elem2$elem2.2
NULL
$elem3
$elem3$elem3.1
[1] "third1"
$elem3$elem3.2
$elem3$elem3.2$elem3.2.1
NULL
$elem3$elem3.2$elem3.2.2
NULL
$elem3$elem3.2$elem3.2.3
[1] "third2.3"
$elem3$elem4
[1] "fourth"
所需解决方案:
$elem1
[1] "first"
$elem2
$elem2$elem2.1
[1] "second1"
$elem2$elem2.2
NA
$elem3
$elem3$elem3.1
[1] "third1"
$elem3$elem3.2
$elem3$elem3.2$elem3.2.1
NA
$elem3$elem3.2$elem3.2.2
NA
$elem3$elem3.2$elem3.2.3
[1] "third2.3"
$elem3$elem4
[1] "fourth"
可以创建递归函数
replace_null <- function(x){
x <- purrr::map(x, ~ replace(.x, is.null(.x), NA_character_))
purrr::map(x, ~ if(is.list(.x)) replace_null(.x) else .x)
}
-检查
replace_null(myList)
#$elem1
#[1] "first"
#$elem2
#$elem2$elem2.1
#[1] "second1"
#$elem2$elem2.2
#[1] NA
#$elem3
#$elem3$elem3.1
#[1] "third1"
#$elem3$elem3.2
#$elem3$elem3.2$elem3.2.1
#[1] NA
#$elem3$elem3.2$elem3.2.2
#[1] NA
#$elem3$elem3.2$elem3.2.3
#[1] "third2.3"
#$elem3$elem4
#[1] "fourth"