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.
Voici une autre option:
Filter(Negate(is.null), x)
Qu'en est-il de:
x[!unlist(lapply(x, is.null))]
Voici une brève description de ce qui se passe.
lapply
nous dit quels éléments sont NULL
R> lapply(x, is.null)
$a
[1] FALSE
$b
[1] FALSE
$c
[1] TRUE
Ensuite, nous convectons la liste en un vecteur:
R> unlist(lapply(x, is.null))
a b c
FALSE FALSE TRUE
Ensuite, nous passons TRUE
à FALSE
:
R> !unlist(lapply(x, is.null))
a b c
TRUE TRUE FALSE
Enfin, nous sélectionnons les éléments en utilisant la notation habituelle:
x[!unlist(lapply(x, is.null))]
x[!sapply(x,is.null)]
Ceci se généralise à toute instruction logique de la liste, juste sous dans la logique pour "is.null".
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