Eliminación de elementos NULL de una lista de R
2025-10-23
Eliminación de elementos NULL de una lista de R
En las listas de R aparecen de vez en cuando elementos cuyo valor es NULL. Si deseamos crear una nueva lista sin estos valores, existen diversas formas de conseguirlo.
Aquí se mencionan varias aproximaciones. Detallamos la más eficiente de ellas.
Filter, el comando de R base
En primer lugar generamos una lista que contenga elementos nulos en los puestos pares y que en los elementos impares aparezca la correspondiente letra del abecedario.
x <- lapply(1L:8L,function(i){ if(i%%2L == 1L) letters[i] }) x
[[1]] [1] "a" [[2]] NULL [[3]] [1] "c" [[4]] NULL [[5]] [1] "e" [[6]] NULL [[7]] [1] "g" [[8]] NULL
Revisando las funciones básicas de R, el procedimiento más eficiente y elegante consiste en utilizar Filter. Así, la instrucción siguiente elimina los elementos nulos de la lista.
Filter(Negate(is.null), x)
[[1]] [1] "a" [[2]] [1] "c" [[3]] [1] "e" [[4]] [1] "g"
Comparativa con funciones de otros paquetes
Comparando el tiempo de ejecución entre diversas funciones de paquetes muy conocidos que obtienen el mismo resultado, comprobamos que la función Filter tarda cuatro veces menos. Creamos una lista de diez mil elementos, de los cuales la mitad de ellos son nulos, para contrastar el tiempo de ejecución del comando Filter con el tiempo que tarda la función purrr::compact.
library(microbenchmark) library(purrr) listalarga <- lapply(1L:10^5,function(i){ if(i%%2L == 1L) letters[i%%length(letters) + 1L] }) microbenchmark( R = Filter(Negate(is.null), listalarga), purrr = compact(listalarga) )
Adjuntando el paquete: ‘purrr’
The following object is masked from ‘package:data.table’:
transpose
The following object is masked from ‘package:car’:
some
Unit: milliseconds
expr min lq mean median uq max neval
R 50.66338 54.21074 55.79424 55.55687 56.91012 69.27488 100
purrr 212.62756 224.81023 229.97528 228.20544 233.70211 276.06239 100