UP | HOME |

Eliminación de elementos NULL de una lista de R

2025-11-03

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.

San José con el Niño dormido en brazos, Francisco Camilo

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)
)

Attaching package: ‘purrr’

The following object is masked from ‘package:jsonlite’:

    flatten

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  55.06376  59.61545  67.1805  62.14317  68.41463 100.5994   100
 purrr 247.03097 258.87787 293.0068 261.10182 306.35317 424.6425   100