rlist:以NA递归过滤出列表节点

时间:2014-10-14 13:45:43

标签: r

使用(最好)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)))

在上面的示例中,由于p1p3个节点在其层次结构中的某处包含NA,因此预期的输出列表应仅为p2。我们事先并不知道输入列表的结构或名称。

2 个答案:

答案 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

同时使用pipeRrlist使代码更清晰:

devs %>>% 
  list.filter(. %>>% 
      list.search(anyNA(.)) %>>% 
      length == 0L)

这仅限p2

这几乎是您的请求的直接翻译:)

或更简单的方法

list.filter(devs, !anyNA(unlist(.)))
相关问题