2013-03-08 88 views
2

我有一个列表,其中有些列表是NAempty lists。我想提取所有填充数据的列表并删除所有列表empty(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))) 

我只想提取与在它的5S名单。前6个列表应该被忽略,例如除去。

任何帮助表示赞赏

+4

'L [!is.na(L)]'(除去NA的在第一级)? – Arun 2013-03-08 11:27:35

+0

@Arun谢谢,有时我不知道它有多简单:S – 2013-03-08 11:29:22

+1

@Arun即使它很简单,也许你应该添加它作为答案,以便它可以标记并从未答复的Q中删除? – 2013-03-08 11:38:45

回答

7

因此,在第一级删除NA,你可以直接使用is.na

l[!is.na(l)] 

另外,您也可以使用Filter它试图强迫的结果评估函数逻辑并返回那些评估为TRUE的元素。你可以做,例如:

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

(或)相同(如@flodel写入下评论)

Filter(Negate(is.na), l) 
+1

或'Filter(Negate(is.na),l)' – flodel 2013-03-08 12:11:25

+0

@Arun 2中哪个最快?我在两个函数上做了'system.time',1st是最快的。但是,这是3000'列表'。 – 2013-03-08 12:46:16

+0

@ flodel,的确如此!辉煌! – Arun 2013-03-08 13:05:47