【发布时间】: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元素可以出现在列表的不同层次结构级别吗?如果是这样,您可以使用嵌套的map:map(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