tabla - infinito en r
Extraer elementos no nulos de una lista en R (4)
Tengo una lista como esta:
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
Y quiero extraer todos los elementos que no sean nulos. ¿Cómo se puede hacer esto? Gracias.
Aquí hay otra opción:
Filter(Negate(is.null), x)
Más simple y probablemente más rápido que lo anterior, lo siguiente funciona para listas de cualquier valor no recursivo (en el sentido 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))
Imprime str(example_2_LST)
:
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
Qué pasa:
x[!unlist(lapply(x, is.null))]
Aquí hay una breve descripción de lo que está pasando.
lapply
nos dice qué elementos sonNULL
R> lapply(x, is.null) $a [1] FALSE $b [1] FALSE $c [1] TRUE
A continuación convectamos la lista en un vector:
R> unlist(lapply(x, is.null)) a b c FALSE FALSE TRUE
Entonces cambiamos
TRUE
aFALSE
:R> !unlist(lapply(x, is.null)) a b c TRUE TRUE FALSE
Finalmente, seleccionamos los elementos usando la notación habitual:
x[!unlist(lapply(x, is.null))]
x[!sapply(x,is.null)]
Esto generaliza a cualquier declaración lógica acerca de la lista, solo sub en la lógica para "is.null".