11 OBJETOS Y ETIQUETAS ESPECIALES

En R existen algunos objetos con un valor determinado. Está, por ejemplo, la constante pi, es decir, la razón entre la circunferencia de un círculo y su diámetro (3.141593…); un vector con el nombre de los meses en inglés, tanto en su forma completa (month.name) como abreviada (month.abb), y vectores con las letras, tanto en minúscula (letters) como en mayúscula (LETTERS).

Más allá de estas curiosidades, en R existen algunas cadenas de caracteres con significado y/o uso especial. Entre estas se encuentran Inf, -Inf, NaN, NA y NULL.

Las etiquetas Inf y -Inf representan los conceptos de infinito positivo e infinito negativo, respectivamente. La primera se obtiene, por ejemplo, al evaluar la razón entre un real positivo y cero, mientras que la segunda se obtiene al evaluar la razón entre un real negativo y cero. Tanto Inf como -Inf son vectores numéricos y generan resultados consecuentes cuando se incorporan en una operación aritmética.

La etiqueta NaN (not a number) aparece para expresar un resultado no numérico o indefinido. Paradójicamente, NaN es un vector numérico. Si se evalúa, por ejemplo, el logaritmo de un real negativo o la razón Inf/Inf, el resultado es NaN. Al ser NaN un vector numérico, admite operaciones aritméticas, sin generar mensajes de error; no obstante, el resultado de cualquier operación que involucre un elemento NaN será, desde luego, NaN. La función is.nan informa cuáles elementos dentro de un objeto son NaN.

11.1 Información faltante

La información faltante se identifica en R con la etiqueta NA (not available). Este descriptor no significa de manera alguna que el valor del elemento en cuestión sea cero; simplemente que no se tiene dicha información, ya sea porque se perdió o simplemente porque nunca se registró. El descriptor NA marca un espacio vacío.

Cuando se realiza un proceso de importación, R lee automáticamente los espacios vacíos como NA. Asimismo, se reconocen como tal los elementos que en la base de datos original vengan marcados explícitamente con NA (en mayúscula sostenida).

La forma de este descriptor es la misma, sin importar la clase del objeto contenedor. Consecuentemente, NA puede representar un número faltante, una cadena de caracteres faltante, un valor lógico faltante o un complejo faltante.

La función is.na informa cuáles elementos dentro de un objeto son NA. Considérese el siguiente vector:

v1 <- c(35, NA, 43, 18, NA, NA, 16)
is.na(v1)
#> [1] FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE

Para contabilizar el número de elementos faltantes, se usa:

sum(is.na(v1))
#> [1] 3

Para contabilizar el número de elementos no faltantes, se suma el resultado de la negación (!) de la función is.na.

sum(!is.na(v1))
#> [1] 4

Algunas funciones, tales como mean, weighted.mean, var y sd tienen un argumento optativo que permite remover los datos perdidos antes de realizar las operaciones. Si se utiliza cualquiera de estas funciones, con sus argumentos por defecto, sobre el vector v1, el resultado obtenido es NA. No obstante, al usar el argumento na.rm = T21, se eliminan los tres elementos faltantes y se realizan las operaciones sobre los otros cuatro elementos.

mean(v1, na.rm = T)
#> [1] 28
var(v1, na.rm = T)
#> [1] 172.6667
sd(v1, na.rm = T)
#> [1] 13.14027

La función anyNA aplicada sobre un objeto permite averiguar, de manera rápida, si este tiene al menos un elemento perdido.

11.2 El objeto nulo

NULL representa un objeto nulo o vacío. A diferencia de NA que se utiliza para representar posiciones faltantes dentro de un objeto y que se adapta a la clase del objeto contenedor, NULL no ocupa ninguna posición dentro de ningún objeto. NULL es en sí mismo un objeto único en su clase (clase NULL). El objeto NULL no tiene tamaño ni dimensiones.

La función is.null permite evaluar si su argumento es el objeto nulo.

A pesar de la aparente intrascendentalidad del objeto nulo, este tiene una característica que resulta muy útil en programación: el objeto nulo existe. Cuando se realiza una asignación con el objeto nulo, se le da existencia a un ‘molde’ vacío y flexible que se adapta a la naturaleza de los elementos que se usen para su llenado, lo que hace que el objeto nulo sea muy útil para la inicialización de objetos.

a <- NULL
length(a)
#> [1] 0
exists("a")
#> [1] TRUE

Es común que en muchas funciones aparezcan argumentos con valor NULL. Se trata de argumentos que, sin ser obligatorios, podrían ser modificados por el usuario. En tales casos, el script suele incorporar la verificación sobre el estado de tales argumentos, siguiendo diferentes líneas de acción dependiendo de si el objeto se mantiene nulo (no fue modificado por el usuario) o si se le asignó algún valor.

Para ilustrar lo anterior, supóngase que una función evalúa una serie de contrastes entre grupos de medias, acorde con una serie de coeficientes suministrados por el usuario. Dicha función podría incorporar un argumento como nombre.cont = NULL, que le permitiera al usuario personalizar el nombre de cada uno de los contrastes evaluados. En su defecto, si el usuario no le asignara ningún valor a dicho argumento, es decir, si is.null(nombre.cont) arroja un resultado verdadero, la función podría crear nombres genéricos del tipo “Contraste 1”, “Contraste 2”, etc.