如何在不丢失空值的情况下展开嵌套列表?R语言技术求助
问题场景
给定R语言数据对象:
dat=list(list(id = "T"), list(id = "T"), structure(list(NULL), names = NA_character_), list(id = "T"), list(id = "T"), list(id = "T"))
尝试用unlist(dat)展开嵌套列表没成功,又试了:
dat[sapply(dat, is.null)] <- NA
这个方法也没用,现在需要在不丢失空值的前提下展开这个嵌套列表。
解决办法
基础R实现
写个简单的处理函数,挨个提取每个子列表里的id,提取不到就返回NA:
extract_id <- function(x) { if (!is.null(x$id)) { x$id } else { NA_character_ } } # 遍历整个列表处理 result <- sapply(dat, extract_id)
运行后得到的result是:
[1] "T" "T" NA "T" "T" "T"
用purrr包简化写法
如果装了purrr包,一行就能搞定:
library(purrr) result <- map_chr(dat, ~ .x$id %||% NA_character_)
这里的%||%是purrr的运算符,意思是左边值为NULL时就返回右边的NA。
为啥原来的方法不行?
unlist(dat)失效是因为第三个元素是带NA名称的NULL结构,unlist会直接忽略这类无效元素,导致空值位置丢失;dat[sapply(dat, is.null)] <- NA没用是因为第三个元素不是纯NULL,而是包含NULL的列表结构,is.null()对它返回FALSE,根本没触发替换。
内容的提问来源于stack exchange,提问作者temor
相关产品推荐
相关产品推荐

