【问题标题】:rlist: recursively filter out list nodes with NArlist:递归过滤掉具有NA的列表节点
【发布时间】:2014-10-14 13:45:42
【问题描述】:

使用(最好)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。我们事先并不知道输入列表的结构或名称。

【问题讨论】:

  • rlist 标签尚不存在,请有足够高声誉的人创建它吗?

标签: r


【解决方案1】:

怎么样:

# 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)))]

【讨论】:

    【解决方案2】:

    list.search() 按条件递归扫描列表,可用于在devs 的子元素中查找NAs。

    同时使用pipeRrlist可以让代码更清晰:

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

    这仅针对p2

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

    或者更简单的方法是

    list.filter(devs, !anyNA(unlist(.)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      相关资源
      最近更新 更多