web-dev-qa-db-fra.com

Extraire des éléments non nuls d'une liste dans R

J'ai une liste comme celle-ci:

    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

et je veux extraire tous les éléments qui ne sont pas nuls. Comment cela peut-il être fait? Merci.

24
qed

Voici une autre option:

Filter(Negate(is.null), x)
33
Matthew Plourde

Qu'en est-il de:

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

Voici une brève description de ce qui se passe.

  1. lapply nous dit quels éléments sont NULL

    R> lapply(x, is.null)
    $a
    [1] FALSE
    
    $b
    [1] FALSE
    
    $c
    [1] TRUE
    
  2. Ensuite, nous convectons la liste en un vecteur:

    R> unlist(lapply(x, is.null)) 
    a     b     c 
    FALSE FALSE  TRUE 
    
  3. Ensuite, nous passons TRUE à FALSE:

    R> !unlist(lapply(x, is.null))
        a     b     c 
    TRUE  TRUE FALSE 
    
  4. Enfin, nous sélectionnons les éléments en utilisant la notation habituelle:

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

Ceci se généralise à toute instruction logique de la liste, juste sous dans la logique pour "is.null".

3
ColinTea

Plus simple et probablement plus rapide que ce qui précède, les opérations suivantes fonctionnent pour les listes de valeurs non récursives (au sens de 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) imprime:

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