如何在R中的任意嵌套列表上替换NULL值?

问题描述 投票:1回答:1

我有一个任意嵌套的列表(没有规则)。我需要将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"
r purrr
1个回答
0
投票

可以创建递归函数

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"
© www.soinside.com 2019 - 2024. All rights reserved.