R-使用purrr用列表中的NA替换NULL元素

时间:2019-02-28 23:50:16

标签: r list data-manipulation purrr

在尝试在清除列表上使用rbindlist之前,我试图用map()中的NA替换下面列表的NULL元素:

m = list(min = list(id = "min", val = NULL), 
     max = list(id = "max", val = 7), 
     split = list(id = "split", val = "gini"))

str(m)
List of 3
 $ min  :List of 2
  ..$ id : chr "min"
  ..$ val: NULL
 $ max  :List of 2
  ..$ id : chr "max"
  ..$ val: num 7
 $ split:List of 2
  ..$ id : chr "split"
  ..$ val: chr "gini"

我尝试过:map(m, ~list_modify(.x, new = 8), .default = NA) %>% rbindlist,但是我不确定.default = NA为何不起作用。从文档的示例中,我猜测是因为.default = NA在list_modify返回的列表的第一级检查NULL?将其放置在list_modify()中也不起作用。有没有一种方法可以在不使用lapply的情况下用map管道内部的NA替换NULL?

1 个答案:

答案 0 :(得分:0)

使用purrr::map_depth,可以指定替换值的深度:

> m = list(min = list(id = "min", val = NULL), 
>          max = list(id = "max", val = 7), 
>          split = list(id = "split", val = "gini"))

> res <- purrr::map_depth(m, 2, ~ifelse(is.null(.x), NA, .x) )
> str(res)

List of 3
 $ min  :List of 2
  ..$ id : chr "min"
  ..$ val: logi NA
 $ max  :List of 2
  ..$ id : chr "max"
  ..$ val: num 7
 $ split:List of 2
  ..$ id : chr "split"
  ..$ val: chr "gini"