Muchos lenguajes tienen una forma como null o none para indicar un valor inexistente.
Como R está diseñado para manejar grandes volúmenes de datos (a menudo desordenados), tiene múltiples formas de la nada.
El objetivo general es señalar los valores faltantes o sospechosos a medida que se encuentran, y luego continuar sin lanzar una excepción.
Si un valor realmente no existe, se representa con NULL. Esto es probablemente lo más parecido a lo que harían C o Python.
v <- c() # zero-length vector
v
#> NULL
is.null(v)
#> [1] TRUE
En muchos contextos, los valores NULL simplemente se ignoran:
c(2, 3, NULL, 5)
#> [1] 2 3 5
Para situaciones en las que un valor existe pero no sabemos cuál es, se utiliza NA. Por ejemplo, al contar vehículos que viajan por una carretera, los observadores humanos podrían enfermar o los sensores automáticos averiarse, pero el tráfico sigue fluyendo.
v <- c(1, 2, NA, 4, 5)
v
#> [1] 1 2 NA 4 5
is.na(v) # test for data gaps
#> [1] FALSE FALSE TRUE FALSE FALSE
Así, NA es un marcador de posición, que advierte a los humanos de que necesitan tomar una decisión sobre cómo manejarlo.
Las funciones estadísticas normalmente devuelven NA por defecto si hay valores NA.
Si quieres que estos valores se ignoren, usa el parámetro na.rm (eliminar NA) para hacerlo explícito:
v <- c(1, 2, NA, 4, 5)
mean(v)
#> [1] NA
mean(v, na.rm = TRUE)
#> [1] 3
Abreviatura de «Not a Number», NaN señala un problema de cálculo en situaciones en las que se esperaba un número.
n <- c(0, 2, 4)
d <- c(0, 1, 2)
n / d
#> [1] NaN 2 2 # 0/0 is mathematically undefined
is.nan(n / d)
#> [1] TRUE FALSE FALSE
Esta no es la única posibilidad para cálculos «inválidos».
Dividir por cero devolverá Inf o -Inf para un numerador distinto de cero, sin lanzar un error.
1 / 0
#> [1] Inf
Quizá sorprendentemente, R no tiene una forma estándar de comprobar si algo está vacío, aunque algunos paquetes de terceros implementan sus propias funciones como is.empty().
Incluso generar un vector vacío no es del todo obvio.
Vimos en una sección anterior que c() sin argumentos devuelve NULL, no un vector.
is.vector(c())
#> [1] FALSE
Funciones como logical() o integer() toman un argumento que especifica la longitud deseada, que puede ser cero.
z <- logical(0)
is.vector(z)
#> [1] TRUE
length(z)
#> [1] 0
También podemos generar un vector y luego eliminar cada elemento, como se describe en el concepto de vectores. Esto da como resultado un vector de longitud 0 de un tipo apropiado.
v <- 5
v[-1] # delete the first element
#> numeric(0)