Как заменить значения NULL на произвольно вложенный список в R? - PullRequest
4 голосов
/ 24 апреля 2020

У меня есть произвольно вложенный список (без правил). Мне нужно заменить 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"

1 Ответ

3 голосов
/ 25 апреля 2020

Может быть создана рекурсивная функция

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) 

}

-checking

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...