Al igual que con los datos, cuando intentamos hacer operaciones con una estructura de datos, R intenta coercionarla al tipo apropiado para poder llevarlas a cabo con éxito.
También podemos usar alguna de las funciones de la familia as() coercionar de un tipo de estructura de datos. A continuación se presentan las más comunes.
Función | Coerciona a | Coerciona Extosamente a |
---|---|---|
as.vector() |
Vector | Matrices |
as.matrix() |
Matrices | Vectores, Data Frames |
as.data.frame() |
Data Frame | Vectores, Matrices |
as.list() |
Lista | Vectores, Matrices, Data Frames |
Expliquemos lo anterior dicho:
# Definimos un vector:
v <- c("Ana", "Come", "Banana")
print(v)
## [1] "Ana" "Come" "Banana"
# Definimos una matrix:
m <- matrix(sample(10, size = 4,replace = TRUE), nrow = 2)
print(m)
## [,1] [,2]
## [1,] 4 8
## [2,] 3 1
# Definimos una data frame:
df <- data.frame("dato"= c("Expectativa" , "Realidad"),
"Huevos" = c(1800, 9000),
"Azucar" = c(90, 3000))
print(df)
## dato Huevos Azucar
## 1 Expectativa 1800 90
## 2 Realidad 9000 3000
# Definimos una lista
l <- list("Vector" = v, "Matriz"= m, "DataFrame"= df)
print(l)
## $Vector
## [1] "Ana" "Come" "Banana"
##
## $Matriz
## [,1] [,2]
## [1,] 4 8
## [2,] 3 1
##
## $DataFrame
## dato Huevos Azucar
## 1 Expectativa 1800 90
## 2 Realidad 9000 3000
as.vector()
:Coercionar un tipo de datoa vecto (En este caso la matriz y el data frame):
# Con as.vector() coercionamos los datos:
"Volvemos a la matriz m en un vector"
## [1] "Volvemos a la matriz m en un vector"
as.vector(m)
## [1] 4 3 8 1
"Volvemos al data frame en un vector"
## [1] "Volvemos al data frame en un vector"
as.vector(df)
## dato Huevos Azucar
## 1 Expectativa 1800 90
## 2 Realidad 9000 3000
as.vector()
no afecta la integridad del elemento dentro del parentesis, es decir, el metodo devuelve la coeerción de este, por ende los elementos definidos anteriormente no son afectados.# Veamos que devulve para lista:
as.vector(l)
## $Vector
## [1] "Ana" "Come" "Banana"
##
## $Matriz
## [,1] [,2]
## [1,] 4 8
## [2,] 3 1
##
## $DataFrame
## dato Huevos Azucar
## 1 Expectativa 1800 90
## 2 Realidad 9000 3000
La coerción que intentamos sólo tuvo éxito para una matriz. Para data frame y lista, nos devolvió los mismos objetos.
Nota que
as.vector()
no devolvió un error o una advertencia a pesar de que no tuvo éxito al coercionar, en este caso un data frame o una lista. Esto es importante, pues no puedes confiar queas.vector()
tuvo éxito porque corrió sin errores, es necesaria una verificación adicional. Como R intenta coercionar automáticamente, esto puede producir resultados inesperados si no tenemos cuidado.
as.matrix()
:intentemos coercionar con as.matrix()
"El vector coercionado saldra una matriz con una sola columna:"
## [1] "El vector coercionado saldra una matriz con una sola columna:"
as.matrix(v) # coercionar el vector v
## [,1]
## [1,] "Ana"
## [2,] "Come"
## [3,] "Banana"
# Coercionar un data.frame():
as.matrix(df)
## dato Huevos Azucar
## [1,] "Expectativa" "1800" " 90"
## [2,] "Realidad" "9000" "3000"
# Coercionar una lista:
as.matrix(l)
## [,1]
## Vector Character,3
## Matriz Integer,4
## DataFrame List,3
Por su parte, al correr la función con un data frame, coercionamos también todos los datos que contiene, siguiendo las reglas de coerción de tipos de dato
Al coercionar una lista a una matriz, efectivamente obtenemos un objeto de este tipo, sin embargo perdemos toda la información que contiene, por lo tanto, no podemos considerar que esta es una coerción exitosa. Del mismo modo que con as.vector()
, no nos es mostrado ningún error ni advertencia.
as.data.frame()
:# Coercionar un vector a data frame:
as.data.frame(v)
## v
## 1 Ana
## 2 Come
## 3 Banana
# Coercionar una matriz a data frame:
as.data.frame(m)
## V1 V2
## 1 4 8
## 2 3 1
Tuvimos éxito al coercionar vectores y matrices.
El vector, al igual que cuando fue coercionado a matriz, devolvió como resultado un objeto con una sola columna, mientras que la matriz conservó sus renglones y columnas.
En este caso, al intentar la coerción de lista a data frame, obtenemos un error. Esta es la única situación en la que esto ocurre utilizando las funciones revisadas en esta sección.
> # Coercionar una lista a data.frame:
> as.data.frame(l)
OUTPUT:
> Error in (function (..., row.names = NULL,
check.rows = FALSE, check.names = TRUE, :
arguments imply differing number of rows: 3, 2
as.list()
:Dado que las listas son el tipo de objeto más flexible de todos, Notaremos un exito en todos los caos de nuestra operación:
# De vector a lista:
as.list(v)
## [[1]]
## [1] "Ana"
##
## [[2]]
## [1] "Come"
##
## [[3]]
## [1] "Banana"
# De matriz a lista:
as.list(m)
## [[1]]
## [1] 4
##
## [[2]]
## [1] 3
##
## [[3]]
## [1] 8
##
## [[4]]
## [1] 1
# De data frame a lista:
as.list(df)
## $dato
## [1] "Expectativa" "Realidad"
##
## $Huevos
## [1] 1800 9000
##
## $Azucar
## [1] 90 3000
para los vectores y matrices, cada uno de los elementos es transformado en un elemento dentro de la lista resultante. Si tuvieramos una matriz con cuarenta y ocho celdas, obtendríamos una lista con ese mismo número de elementos.
En cambio, para un data frame, el resultado es una lista, en la que cada elemento contiene los datos de una columna del data frame original. Un data frame con diez columnas resultará en una lista de diez elementos.
“Conocer cómo ocurre la coerción de estructuras de datos te ayudará a entender mejor algunos resultados devueltos por funciones de R, además de que te facilitará la manipulación y procesamiento de datos.”