2013-06-03 19 views
19

Mam listę takiego:Wyciąg non zerowe elementy z listy w R

x = list(a = 1:4, b = 3:10, c = NULL) 
    x 
    #$a 
    #[1] 1 2 3 4 
    # 
    #$b 
    #[1] 3 4 5 6 7 8 9 10 
    # 
    #$c 
    #NULL 

i chcę, aby wyodrębnić wszystkie elementy, które nie są puste. Jak to zrobić? Dzięki.

Odpowiedz

28

Oto kolejny opcję:

Filter(Negate(is.null), x) 
11

Co o:

x[!unlist(lapply(x, is.null))] 

Oto krótki opis tego, co się dzieje.

  1. lapply mówi nam, które elementy są NULL

    R> lapply(x, is.null) 
    $a 
    [1] FALSE 
    
    $b 
    [1] FALSE 
    
    $c 
    [1] TRUE 
    
  2. Następnie ConvECt listę do wektora:

    R> unlist(lapply(x, is.null)) 
    a  b  c 
    FALSE FALSE TRUE 
    
  3. Następnie przełączamy TRUE do FALSE:

    R> !unlist(lapply(x, is.null)) 
        a  b  c 
    TRUE TRUE FALSE 
    
  4. Wreszcie, wybierz elementy używając zwykłej notacji:

    x[!unlist(lapply(x, is.null))] 
    
+3

Czy "x [! Sapply (x, is.null)] nie będzie szybsze? – Julius

0

Prostsze i prawdopodobnie szybciej niż wymienione powyżej, następujące prace na listach dowolnych wartości nierekursywnych (w znaczeniu is.recursive):

example_1_LST <- list(NULL, a=1.0, b=Matrix::Matrix(), c=NULL, d=4L) 
example_2_LST <- as.list(unlist(example_1_LST, recursive=FALSE)) 

str(example_2_LST) drukuje:

List of 3 
$ a: num 1 
$ b:Formal class 'lsyMatrix' [package "Matrix"] with 5 slots 
    .. [email protected] x  : logi NA 
    .. [email protected] Dim  : int [1:2] 1 1 
    .. [email protected] Dimnames:List of 2 
    .. .. ..$ : NULL 
    .. .. ..$ : NULL 
    .. [email protected] uplo : chr "U" 
    .. [email protected] factors : list() 
$ d: int 4 
+0

Nie trzeba odnosić się do funkcji w bazie i utils z 'base ::' i 'utils ::'. –

1
x[!sapply(x,is.null)] 

ten uogólnia się jakiejkolwiek logicznej oświadczenia o listy, tylko sub w logice dla "is.null".