使用(最好)rlist
包,有没有办法过滤掉(多级)列表的节点,以便结果列表在任何级别都不包含NA
值?
library(rlist)
devs <-
list(
p1=list(name="Ken",age=24,
interest=c("reading","music","movies"),
lang=list(r=NA,csharp=4)), # <------ NA here
p2=list(name="James",age=25,
interest=c("sports","music"),
lang=list(r=3,java=2,cpp=5)),
p3=list(name="Penny",age=NA, # <------ NA here
interest=c("movies","reading"),
lang=list(r=1,cpp=4,python=2)))
在上面的示例中,由于p1
和p3
个节点在其层次结构中的某处包含NA
,因此预期的输出列表应仅为p2
。我们事先并不知道输入列表的结构或名称。
答案 0 :(得分:5)
怎么样:
# for every element in devs, does it have 0 NA elements when unlisted?
sapply(devs, function(x) !anyNA(unlist(x)))
返回:
p1 p2 p3
FALSE TRUE FALSE
您可以通过以下方式获得所需的列表元素:
devs[sapply(devs, function(x) !anyNA(unlist(x)))]
答案 1 :(得分:2)
list.search()
以条件递归扫描列表,可用于查找NA
子元素中的devs
。
同时使用pipeR
和rlist
使代码更清晰:
devs %>>%
list.filter(. %>>%
list.search(anyNA(.)) %>>%
length == 0L)
这仅限p2
。
这几乎是您的请求的直接翻译:)
或更简单的方法
list.filter(devs, !anyNA(unlist(.)))