【问题标题】:R - Using purrr to replace NULL elements with NA in a list of listsR - 使用 purrr 将列表列表中的 NULL 元素替换为 NA
【发布时间】:2019-07-22 23:29:46
【问题描述】:

在清理列表上使用 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 的情况下在地图管道本身内用 NA 替换 NULL?

【问题讨论】:

  • NULL 元素可以出现在列表的不同层次结构级别吗?如果是这样,您可以使用嵌套的mapmap(m, function(x) map(x, function(y) ifelse(is.null(y), NA, y)))
  • 感谢@Maurits,是的,它们可以出现在除第一个之外的所有级别。我只需要在第二级替换 NULL 即可使用 rbindlist(因为 NULL 元素的长度为 0,非 NULL 的长度为 1)。嵌套地图是否应该在更深层次上工作?
  • 对不起,我意识到我在评论中没有说得很清楚; map(m, function(x) map(x, function(y) ifelse(is.null(y), NA, y))) 只会替换第二级的 NULL 条目,因此这应该适用于您的情况。

标签: r list data-manipulation purrr


【解决方案1】:

使用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"

reprex package (v2.0.1) 于 2021-10-18 创建

【讨论】:

    猜你喜欢
    • 2021-10-22
    • 2018-08-25
    • 2020-07-01
    • 2020-08-19
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多