2014-10-14 35 views
5

ile liste düğümlerini yinelemeli olarak filtreleyin (tercihen) rlist paketini kullanarak, (çok düzeyli) listenin düğümlerini filtrelemenin bir yolu var mı, böylece sonuç listesi hiçbir seviyede NA değeri tutmuyor mu? p1 ve p3 düğümleri yerde kendi hiyerarşide NA içeren Yukarıdaki örnekte 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))) 

, beklenen çıkış listesi p2 tek olmalıdır. Giriş listesinin yapısını veya isimlerini önceden bilmiyoruz.

+1

'henüz yok rlist' etiketi, yeterince yüksek bir üne sahip birisi lütfen oluşturabilir mi? –

cevap

2

list.search() yinelemeli listeyi tarar bir koşul vealt öğelerinde NA s bulmak için kullanılabilir. Kod daha anlaşılır hale getirmek pipeR ve birlikte rlist kullanma

:

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

Bu single dışarı p2 sadece.

Bu neredeyse isteğiniz :)

doğrudan çeviri veya daha kolay bir yoldur

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

ne dersiniz: döndürür

# 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 

yapabilirsiniz sadece istenilen liste elemanını (ler) olsun:

devs[sapply(devs, function(x) !anyNA(unlist(x)))] 
İlgili konular