4.7 Coerción

En R, los datos pueden ser coercionados, es decir, forzados, para transformarlos de un tipo a otro.

La coerción es muy importante. Cuando pedimos a R ejecutar una operación, intentará coercionar de manera implícita, sin avisarnos, los datos de su tipo original al tipo correcto que permita realizarla. Habrá ocasiones en las que R tenga éxito y la operación ocurra sin problemas, y otras en las que falle y obtengamos un error.

Lo anterior ocurre porque no todos los tipos de datos pueden ser transformados a los demás, para ello se sigue una regla general.

La coerción de tipos se realiza de los tipos de datos más restrictivos a los más flexibles.

Las coerciones ocurren en el siguiente orden.

lógico -> entero -> numérico -> cadena de texto (logical -> integer -> numeric -> character)

Las coerciones no pueden ocurrir en orden inverso. Podemos coercionar un dato de tipo entero a uno numérico, pero uno de cadena de texto a numérico.

Como los datos de tipo lógico sólo admiten dos valores (TRUE y FALSE), estos son los más restrictivos; mientras que los datos de cadena de texto, al admitir cualquier cantidad y combinación de caracteres, son los más flexibles.

Los factores son un caso particular para la coerción. Dado que son valores numéricos con etiquetas, pueden ser coercionados a tipo numérico y cadena de texto; y los datos numéricos y cadena de texto pueden ser coercionados a factor. Sin embargo, al coercionar un factor tipo numérico, perdemos sus niveles.

4.7.1 Coerción explícita con la familia as()

También podemos hacer coerciones explícitas usando la familia de funciones as().

Función Tipo al que hace coerción
as.integer() Entero
as.numeric() Numerico
as.character() Cadena de texto
as.factor() Factor
as.logical() Lógico
as.null() NULL

Todas estas funciones aceptan como argumento datos o vectores (veremos qué es un vector en el capítulo 6).

Cuando estas funciones tienen éxito en la coerción, nos devuelven datos del tipo pedido. Si fallan, obtenemos NA como resultado.

Por ejemplo, intememos convertir el número 5 a una cadena de texto. Para ello usamos la función as.character().

as.character(5)
## [1] "5"

Esta es una coerción válida, así que tenemos éxito. Pero, si intentamos convertir la palabra “cinco” a un dato numérico, obtendremos una advertencia y NA.

as.numeric("cinco")
## Warning: NAs introducidos por coerción
## [1] NA

Comprobemos el comportamiento especial de los factores.

Podemos coercionar al número 5 y la palabra “cinco” en un factor.

as.factor(5)
## [1] 5
## Levels: 5
as.factor("cinco")
## [1] cinco
## Levels: cinco

Asignamos la palabra “cinco” como factor al objeto factor_cinco.

factor_cinco <- as.factor("cinco")

#Resultado
factor_cinco
## [1] cinco
## Levels: cinco

Ahora podemos coercionar factor_cinco a cadena de texto y a numérico.

# Cadena de texto
as.character(factor_cinco)
## [1] "cinco"
# Numérico
as.numeric(factor_cinco)
## [1] 1

Si coercionamos un dato de tipo lógico a numérico, TRUE siempre devolverá 1 y FALSE dará como resultado 0.

as.numeric(TRUE)
## [1] 1
as.numeric(FALSE)
## [1] 0

Por último, la funcón as.null() siempre devuelve NULL, sin importar el tipo de dato que demos como argumento.

# Lógico
as.null(FALSE)
## NULL
# Numérico
as.null(457)
## NULL
# Cadena de texto
as.null("palabra")
## NULL