R-使用purrr在列表中用NA替换空元素

R-使用purrr在列表中用NA替换空元素,r,list,data-manipulation,purrr,R,List,Data Manipulation,Purrr,我正在尝试使用映射()中的NAs替换下面列表中的空元素,然后在清理后的列表中使用rbindlist: 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

我正在尝试使用映射()中的NAs替换下面列表中的空元素,然后在清理后的列表中使用rbindlist:

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\u modify(.x,new=8),.default=NA)%%>%rbindlist
,但我不太清楚为什么
.default=NA
不起作用。从文档中的示例中,我猜这是因为
.default=NA
检查list\u modify返回的列表的第一级是否为空?将其放在
列表中\u modify()
也不起作用。有没有一种方法可以在不使用Lappy的情况下在映射管道本身内部用NA替换空值?

使用
purr::map\u 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"
>m=list(min=list(id=“min”,val=NULL),
>max=list(id=“max”,val=7),
>拆分=列表(id=“拆分”,val=“基尼”))
>res str(res)
3人名单
$min:2人名单
..$id:chr“min”
..$val:logi NA
$max:2人名单
..$id:chr“max”
..$val:num 7
$split:2人名单
..$id:chr“拆分”
..$val:chr“gini”

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