2013-03-08 2 views
2

У меня есть список списков, где некоторые из них: NA, например. empty 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

'л [! Is.na (л)]' (для удаления NA-х на Первый уровень)? – Arun

+0

@Arun спасибо, иногда я не понимаю, насколько это просто: S –

+1

@ Арун, хотя это просто, может быть, вы должны добавить это как ответ, чтобы его можно было отметить и удалить из неотвеченных Q? –

ответ

7

Таким образом, чтобы удалить NA на первом уровне, вы можете использовать is.na непосредственно:

l[!is.na(l)] 

В качестве альтернативы, вы можете также использовать Filter, которая пытается принудить результаты из оценивает функцию для логического и возвращает те элементы, которые были оценены как TRUE. Вы могли бы сделать, например:

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

(или) эквивалентно (как @flodel пишет под комментарием)

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

или 'Фильтр (Negate (is.na), l)' – flodel

+0

@ Арун, который из 2 будет самым быстрым? Я выполнял 'system.time' на обеих функциях, а 1-й был самым быстрым. Но это с 3000 'lists'. –

+0

@flodel, да, действительно! блестящий! – Arun

Смежные вопросы