从列表中删除空列表

4

我有一个列表,其中一些是NA,例如空列表。我想提取所有填充有数据的列表,并删除所有空(NA)的列表。

我正在尝试的代码是:

lapply(outputfile,function(x){
  if(outputfile != NA){
  test<-lapply(outputfile,unlist)
}})

但是这样做不起作用。

列表的列表如下所示:(随机数据的小示例)

list(NA, NA, NA, NA, NA, NA, list(c(5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5)))

我只想提取包含数字5的列表。前6个列表应该被忽略,即删除。

感谢您的帮助。


4
l[!is.na(l)](用于删除第一层级中的NA值) - Arun
@Arun 谢谢,有时候我没有意识到这可以如此简单:S - Sander Van der Zeeuw
1
@Arun 即使这很简单,也许你应该将其作为答案添加,以便可以标记并从未回答的问题中删除? - Simon O'Hanlon
@SanderVanderZeeuw,所有“空”列表都用NA表示吗?那像这样的列表呢:List <- list(A = NA, B = 1:10, C = vector("character"))List$C会被认为是“空”的吗? - A5C1D2H2I1M1N2O1R2T1
@AnandaMahto 所有空列表都填充了NA,因为这些列表都来自同一计算。 - Sander Van der Zeeuw
@SimonO101,是的,完成了。 - Arun
1个回答

10

因此,要删除第一级别的NA,您可以直接使用is.na

l[!is.na(l)]

或者,您也可以使用 Filter 函数,该函数尝试将评估函数的结果强制转换为逻辑值,并返回那些评估为 TRUE 的元素。例如:

Filter(function(x) !is.na(x), l)

(或者等价地(如@flodel在评论下所写))

Filter(Negate(is.na), l)

2
or Filter(Negate(is.na), l) - flodel
@Arun,这两个哪个更快?我在这两个函数上使用了system.time,第一个是最快的。但是这是在有3000个列表的情况下。 - Sander Van der Zeeuw
@flodel,确实如此!太棒了! - Arun
1
@SanderVanderZeeuw,是的,我认为第一个会更快。但是第二个代码更易于理解。而且我不认为通常会有太多性能损失。 - Arun
1
同样地,我使用这个方法来删除空元素:Filter(function(k) length(k)>0, mylist)。干得好! - Carl Witthoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接