Protocolo:
Daniel Felipe Villa Rengifo
Lenguaje: R
Tema: Manejo de Data Frames en R
Fuentes:
Un Data Frame es una lista de vectores de igual longitud. Una matriz sólo contiene un tipo de datos, mientras que un Data Frame acepta diferentes tipos de datos (numéricos, de caracteres, de factores, etc.).
Podemos crear un Data Frame en R pasando la variables x,y,z,w a la función data.frame()
. Podemos crear un Data Frame y nombrar las columnas con name()
o simplemente especificar el nombre de las variables.
Argumentos:
df: Puede ser una matriz para convertir como Data Frame o una colección de variables unidos.
stringsAsFactors: Convierte strings a factors por defecto.
# Vamos a crear vectores de la misma longitud con diferentes datos:
message("\n# Vamos a crear vectores de la misma longitud con diferentes datos:")
##
## # Vamos a crear vectores de la misma longitud con diferentes datos:
## Creamos las variables x,y,z,w:
cat("\n## Creamos las variables x,y,z,w:")
##
## ## Creamos las variables x,y,z,w:
x <- c(1,2,3,4)
y <- c("Nezuko", "Kimetsu", "Katana", "Midoriya")
z <- c(T, F, F, F)
w <- c(12.12,75.32,3.14,2.71)
cat("\n> x:", x, "\n> y:", y, "\n> z:", z, "\n> w:", w)
##
## > x: 1 2 3 4
## > y: Nezuko Kimetsu Katana Midoriya
## > z: TRUE FALSE FALSE FALSE
## > w: 12.12 75.32 3.14 2.71
## Unoir las variables para crear un dataframe:
message("\n## Unoir las variables para crear un dataframe:")
##
## ## Unoir las variables para crear un dataframe:
df <- data.frame(x,y,z,w)
cat("\ndf <- data.frame(x,y,z,w)", "\n \nOUTPUT:\n \n")
##
## df <- data.frame(x,y,z,w)
##
## OUTPUT:
##
print(df)
## x y z w
## 1 1 Nezuko TRUE 12.12
## 2 2 Kimetsu FALSE 75.32
## 3 3 Katana FALSE 3.14
## 4 4 Midoriya FALSE 2.71
Podemos ver que los encabezados de las columnas tienen el mismo nombre que las variables. Podemos cambiar el nombre de las columnas en R con la función names()
.
# Nombrando el data frame:
message("\n# Nombrando el data frame:")
##
## # Nombrando el data frame:
names(df) <- c("N°", "Anime", "Logical", "XP")
print(df)
## N° Anime Logical XP
## 1 1 Nezuko TRUE 12.12
## 2 2 Kimetsu FALSE 75.32
## 3 3 Katana FALSE 3.14
## 4 4 Midoriya FALSE 2.71
# Ahora Observemos su estructura con str():
cat("\n# Ahora Observemos su estructura con str():")
##
## # Ahora Observemos su estructura con str():
str(df)
## 'data.frame': 4 obs. of 4 variables:
## $ N° : num 1 2 3 4
## $ Anime : chr "Nezuko" "Kimetsu" "Katana" "Midoriya"
## $ Logical: logi TRUE FALSE FALSE FALSE
## $ XP : num 12.12 75.32 3.14 2.71
Nota: De forma predeterminada, el Data Frame devuelve variables string como factor.
Los componentes de un Data Frame pueden ser accedidos como una lista o como una matriz.
Podemos utilizar los operadores [
, [[
o $
para acceder a las columnas del Data Frame.
# Acceder a los elemnetos como lista diferentes maneras:
message("\n# Acceder a los elemnetos como lista diferentes maneras:")
##
## # Acceder a los elemnetos como lista diferentes maneras:
cat("\n> df[\"Anime\"]", "\n \nOUTPUT:\n \n")
##
## > df["Anime"]
##
## OUTPUT:
##
print(df["Anime"])
## Anime
## 1 Nezuko
## 2 Kimetsu
## 3 Katana
## 4 Midoriya
cat("\n> df$Anime", "\n \nOUTPUT:\n \n")
##
## > df$Anime
##
## OUTPUT:
##
print(df$Anime)
## [1] "Nezuko" "Kimetsu" "Katana" "Midoriya"
cat("\n> df[[\"Anime\"]]", "\n \nOUTPUT:\n \n")
##
## > df[["Anime"]]
##
## OUTPUT:
##
print(df[["Anime"]])
## [1] "Nezuko" "Kimetsu" "Katana" "Midoriya"
cat("\n> df[[2]]", "\n \nOUTPUT:\n \n")
##
## > df[[2]]
##
## OUTPUT:
##
print(df[[2]])
## [1] "Nezuko" "Kimetsu" "Katana" "Midoriya"
Nota: El acceso con
[[
o$
es similar. Sin embargo, difiere para[
en que, la indexación con[
nos devolverá un Data Frame pero las otras dos lo reducirán a un vector.
Se puede acceder a los Data Frame como a una matriz proporcionando un índice para la fila y la columna.
Para ilustrar esto, utilizamos conjuntos de datos ya disponibles en R. Los conjuntos de datos disponibles pueden listarse con el comando library(help = "datasets")
.
Utilizaremos el conjunto de datos de árboles que contiene la circunferencia, la altura y el volumen de los cerezos negros.
Un Data Frame puede ser examinado usando funciones como str()
y head()
.
Nota: df[Fila, Columna]
# Veamosla comparación:
message("\n# Veamosla comparación:")
##
## # Veamosla comparación:
cat("\n> str(df)","\n \nOUTPUT:\n \n")
##
## > str(df)
##
## OUTPUT:
##
print(str(df))
## 'data.frame': 4 obs. of 4 variables:
## $ N° : num 1 2 3 4
## $ Anime : chr "Nezuko" "Kimetsu" "Katana" "Midoriya"
## $ Logical: logi TRUE FALSE FALSE FALSE
## $ XP : num 12.12 75.32 3.14 2.71
## NULL
cat("\n> head(df)","\n \nOUTPUT:\n \n")
##
## > head(df)
##
## OUTPUT:
##
print(head(df))
## N° Anime Logical XP
## 1 1 Nezuko TRUE 12.12
## 2 2 Kimetsu FALSE 75.32
## 3 3 Katana FALSE 3.14
## 4 4 Midoriya FALSE 2.71
# Selenccionando la 2da y 3ra fila:
cat("\n# Selenccionando la 2da y 3ra fila:")
##
## # Selenccionando la 2da y 3ra fila:
cat("\n> df[2:3,","\n \nOUTPUT:\n \n")
##
## > df[2:3,
##
## OUTPUT:
##
print(df[2:3,])
## N° Anime Logical XP
## 2 2 Kimetsu FALSE 75.32
## 3 3 Katana FALSE 3.14
# oxdenar por operadores lógicos:
message("\n# ordenar por operadores lógicos:")
##
## # ordenar por operadores lógicos:
cat("\n> df[df <30]","\n \nOUTPUT:\n \n")
##
## > df[df <30]
##
## OUTPUT:
##
df[df <30]
## [1] "1" "2" "3" "4" "TRUE" "FALSE" "FALSE" "FALSE" "12.12"
## [10] " 3.14" " 2.71"
Podemos ver en el último caso que el tipo retornado es un vector que extraeremos los datos de una sola columna.
# Llamar a los elementos del data frame:
message("\n# Llamar a los elementos del data frame:")
##
## # Llamar a los elementos del data frame:
print("Se ve como dataframe no como vector")
## [1] "Se ve como dataframe no como vector"
cat("\n> df[2:4, 4, drop = F]","\n \nOUTPUT:\n \n")
##
## > df[2:4, 4, drop = F]
##
## OUTPUT:
##
print(df[2:4, 4, drop = F])
## XP
## 2 75.32
## 3 3.14
## 4 2.71
Los Data Frame pueden ser modificados como modificamos las matrices a través de la reasignación.
# Observamos nuestro data frame:
print(df)
## N° Anime Logical XP
## 1 1 Nezuko TRUE 12.12
## 2 2 Kimetsu FALSE 75.32
## 3 3 Katana FALSE 3.14
## 4 4 Midoriya FALSE 2.71
## Ahora observamos nuestro renombramiento:
cat("\n> df[3, \"Anime\"] <- \"Tanjiro\"","\n \nOUTPUT:\n \n")
##
## > df[3, "Anime"] <- "Tanjiro"
##
## OUTPUT:
##
df[3, "Anime"] <- "Tanjiro"
print(df[3, "Anime", drop=F])
## Anime
## 3 Tanjiro
print(df)
## N° Anime Logical XP
## 1 1 Nezuko TRUE 12.12
## 2 2 Kimetsu FALSE 75.32
## 3 3 Tanjiro FALSE 3.14
## 4 4 Midoriya FALSE 2.71
Se pueden añadir filas a un Data Frame utilizando la función rbind()
.
# Añandiendo componentes con rbind():
cat("\n# Añandiendo componentes con rbind():")
##
## # Añandiendo componentes con rbind():
cat("\n> rbind(df, list(5, \"OneForAll\", T, 9999.99))","\n \nOUTPUT:\n \n")
##
## > rbind(df, list(5, "OneForAll", T, 9999.99))
##
## OUTPUT:
##
df <- rbind(df, list(5, "OneForAll", T, 9999.99))
print("Se añaden en orden de Fila")
## [1] "Se añaden en orden de Fila"
print(df)
## N° Anime Logical XP
## 1 1 Nezuko TRUE 12.12
## 2 2 Kimetsu FALSE 75.32
## 3 3 Tanjiro FALSE 3.14
## 4 4 Midoriya FALSE 2.71
## 5 5 OneForAll TRUE 9999.99
Simalarmente podemos añadir columnas con cbind()
# Añandiendo componentes con cbind():
cat("\n# Añandiendo componentes con cbind():")
##
## # Añandiendo componentes con cbind():
cat("\n> rbind(df, list(5, \"OneForAll\", T, 9999.99))","\n \nOUTPUT:\n \n")
##
## > rbind(df, list(5, "OneForAll", T, 9999.99))
##
## OUTPUT:
##
df <- cbind(df, Clasificación = c("C+",
"C++",
"A++", "A+", "B+"))
print("Se añaden en orden de Fila")
## [1] "Se añaden en orden de Fila"
print(df)
## N° Anime Logical XP Clasificación
## 1 1 Nezuko TRUE 12.12 C+
## 2 2 Kimetsu FALSE 75.32 C++
## 3 3 Tanjiro FALSE 3.14 A++
## 4 4 Midoriya FALSE 2.71 A+
## 5 5 OneForAll TRUE 9999.99 B+
Dado que los Data Frame se implementan como listas, también podemos añadir nuevas columnas mediante simples asignaciones tipo lista.
print(df)
## N° Anime Logical XP Clasificación
## 1 1 Nezuko TRUE 12.12 C+
## 2 2 Kimetsu FALSE 75.32 C++
## 3 3 Tanjiro FALSE 3.14 A++
## 4 4 Midoriya FALSE 2.71 A+
## 5 5 OneForAll TRUE 9999.99 B+
# Añadimos una nueva columnas con el operador "$":
message("\n# Añadimos una nueva columnas con el operador \"$\":")
##
## # Añadimos una nueva columnas con el operador "$":
cat("\n> df$Finalizada <- c(\"Si\", \"Si\", \"NO\", \"NO\", \"NO\")]",
"\n \nOUTPUT:\n \n")
##
## > df$Finalizada <- c("Si", "Si", "NO", "NO", "NO")]
##
## OUTPUT:
##
df$Finalizada <- c("SI", "SI", "NO", "NO", "NO")
print(df)
## N° Anime Logical XP Clasificación Finalizada
## 1 1 Nezuko TRUE 12.12 C+ SI
## 2 2 Kimetsu FALSE 75.32 C++ SI
## 3 3 Tanjiro FALSE 3.14 A++ NO
## 4 4 Midoriya FALSE 2.71 A+ NO
## 5 5 OneForAll TRUE 9999.99 B+ NO
Las columnas del Data Frame se pueden borrar asignándoles NULL
.
# Eliminemos del data frame a XP:
cat("\n# Eliminemos del data frame a XP:")
##
## # Eliminemos del data frame a XP:
print(df)
## N° Anime Logical XP Clasificación Finalizada
## 1 1 Nezuko TRUE 12.12 C+ SI
## 2 2 Kimetsu FALSE 75.32 C++ SI
## 3 3 Tanjiro FALSE 3.14 A++ NO
## 4 4 Midoriya FALSE 2.71 A+ NO
## 5 5 OneForAll TRUE 9999.99 B+ NO
cat("\n> df$XP <- NULL","\n \nOUTPUT:\n \n")
##
## > df$XP <- NULL
##
## OUTPUT:
##
df$XP <- NULL
print(df)
## N° Anime Logical Clasificación Finalizada
## 1 1 Nezuko TRUE C+ SI
## 2 2 Kimetsu FALSE C++ SI
## 3 3 Tanjiro FALSE A++ NO
## 4 4 Midoriya FALSE A+ NO
## 5 5 OneForAll TRUE B+ NO