Data frame en R
¿Quieres aprender todo sobre data frames en R? Este es un tutorial completo de esta estructura de datos de R. Al final de este tutorial, podrás comprender todos los conceptos básicos para trabajar con un data frame en R, tales como acceder a los datos, añadir nuevas filas o columnas, así como filtrar o crear subconjuntos de los datos.
¿Qué es un data frame en R?
Los data frames (marcos de datos) son el objeto más habitual para almacenar datos en R. En este tipo de objeto, cada individuo o fecha corresponde a una fila y cada columna corresponde a una variable. Dentro de este tipo de estructura puedes almacenar diferentes tipos de datos.
¿Data frame o matriz?
Una cuestión habitual es preguntarse en qué casos debes usar un data frame o una matriz en R. Los data frames son estructuras de datos muy similares a las matrices, pero en el caso de los data frames puedes tener diferentes tipos de datos dentro de las columnas. En consecuencia, la diferencia es que las matrices almacenan tipos de datos homogéneos mientras que los data frames almacenan tipos de datos heterogéneos. Como ejemplo, supón que tienes los siguientes datos:
Producto <- c("Zumo", "Queso", "Yogurt")
Seccion <- c("Bebidas", "Productos lácteos", "Productos lácteos")
Unidades <- c(2, 1, 10)
Puedes almacenar esas variables como matriz utilizando la función cbind
:
x <- cbind(Producto, Seccion, Unidades)
Si imprimes la nueva variable obtendrás el siguiente resultado:
Producto Seccion Unidades
[1,] "Zumo" "Bebidas" "2"
[2,] "Queso" "Productos lácteos" "1"
[3,] "Yogurt" "Productos lácteos" "10"
Sin embargo, puedes notar que el resultado no es satisfactorio, ya que todas las variables se han transformado a la clase caracter. En cambio, si usas la función data.frame
, mantendrás el tipo original de las variables.
Los data frames, a diferencia de las matrices, pueden almacenar diferentes tipos de objetos.
¿Cómo crear un data frame en R?
En R es muy sencillo crear un nuevo data frame. Puedes unir tus variables haciendo uso de la función data.frame
para convertir tus datos a la estructura de datos de tipo data frame. Primero, necesitas tener algunas variables almacenadas para crear el marco de datos en R. En este ejemplo vamos a definir algunas variables de datos meteorológicos. Ten en cuenta que todos los vectores tienen la misma longitud.
temp <- c(20.37, 18.56, 18.4, 21.96, 29.53, 28.16,
36.38, 36.62, 40.03, 27.59, 22.15, 19.85)
humedad <- c(88, 86, 81, 79, 80, 78,
71, 69, 78, 82, 85, 83)
precipitaciones <- c(72, 33.9, 37.5, 36.6, 31.0, 16.6,
1.2, 6.8, 36.8, 30.8, 38.5, 22.7)
mes <- c("enero", "febrero", "marzo", "abril", "mayo", "junio",
"julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre")
Para unir los datos puedes usar la función data.frame
. En este ejemplo, vamos a almacenar el data frame en una variable llamada datos
:
datos <- data.frame(mes = mes, temperatura = temp, humedad = humedad,
precipitaciones = precipitaciones)
names(datos) # Nombres de las variables (columnas)
"mes" "temperatura" "humedad" "precipitaciones"
Primero, es habitual mostrar los primeros valores para hacer algunas comprobaciones. Para ello, puedes hacer uso de la función head
en R, que por defecto mostrará las 6 primeras filas del data frame.
# Primeras filas de nuestro conjunto de datos
head(datos)
mes temperatura humedad precipitaciones
1 enero 20.37 88 72.0
2 febrero 18.56 86 33.9
3 marzo 18.40 81 37.5
4 abril 21.96 79 36.6
5 mayo 29.53 80 31.0
6 junio 28.16 78 16.6
En segundo lugar, puedes utilizar la función summary
que devolverá un resumen estadístico de las variables (columnas) del conjunto de datos.
summary(datos)
mes temperatura humedad precipitaciones
april :1 Min. :18.40 Min. :69.0 Min. : 1.20
august :1 1st Qu.:20.24 1st Qu.:78.0 1st Qu.:21.18
december:1 Median :24.87 Median :80.5 Median :32.45
february:1 Mean :26.63 Mean :80.0 Mean :30.37
january :1 3rd Qu.:31.24 3rd Qu.:83.5 3rd Qu.:36.98
También puedes hacer uso de los data frames de ejemplo que R proporciona. Para buscarlos, puedes llamar a la función data
:
data()
Una vez ejecutado, se abrirá una ventana con una lista de conjuntos de datos disponibles:
Data sets in package "datasets":
AirPassengers Monthly Airline Passenger Numbers 1949-1960
BJsales Sales Data with Leading Indicator
…
Ahora puedes cargar el que quieras con:
data(nombre_del_conjunto_de_datos)
Como ejemplo, si quieres cargar el conjunto de datos AirPassengers
en el espacio de trabajo puedes escribir lo siguiente:
data(AirPassengers)
Crear un data frame vacío en R
En ocasiones puede resultar interesante inicializar un data frame vacío y rellenarlo dentro de un bucle o añadir las filas mediante algún procedimiento. En este caso, la forma más recomendada de crear una estructura de datos vacía es utilizando la función data.frame
y creando variables vacías. Sin embargo, en el siguiente bloque de código mostraremos esta manera y varias alternativas más.
# Variables vacías
dataset <- data.frame(mes = character(),
temperatura = numeric(),
precipitaciones = numeric(),
humedad = numeric())
# Copiando la estructura de otro conjunto de datos
dataset <- datos[FALSE, ] # Recuerda que creamos el objeto 'datos' antes
# Convirtiendo una matriz en data.frame y asignándole nombres a las columnas
dataset <- data.frame(matrix(ncol = 4, nrow = 0))
nombres_columnas <- c("mes", "temperatura", "precipitaciones", "humedad")
colnames(dataset) <- nombres_columnas
# Equivalente a la última opción
dataset <- data.frame(matrix(ncol = 4, nrow = 0,
dimnames = list(NULL, c("mes", "temperatura",
"precipitaciones", "humedad"))))
Accediendo a los datos del data frame
Hay varias formas de acceder a las columnas almacenadas en los data frames:
- Usando el signo del dollar ($) y el nombre de la columna.
- Usando corchetes con el índice de la columna después de una coma.
Como ejemplo, si quieres seleccionar la columna mes
del data frame que creamos antes, ejecuta lo siguiente:
datos$mes
datos[, 1] # Equivalente
También puedes seleccionar varias variables a la vez. Para ello puedes:
- Crear una secuencia de índices.
-
Crear un vector con la función
c
con los nombres de las variables o índices que quieras seleccionar.
# Seleccionando las columnas 1 a 3 con una secuencia
datos[, 1:3]
# Seleccionando columnas con la función 'c'
datos[, c("temperatura", "precipitaciones")]
datos[, c(2, 4)] # Equivalente
Del mismo modo, puedes acceder a filas del data frame con datos[1, ]
o datos[1:2, ]
para seleccionar la primera fila o la primera y la segunda, o seleccionar solo algunos puntos de datos seleccionando filas y columnas a la vez:
# Observación de la primera
# fila y segunda columna
datos[1, 2]
# Primera y segunda fila
# de la segunda columna
datos[1:2, 2]
Acceso directo utilizando la función attach
Si no quieres escribir el nombre del data frame una y otra vez, simplemente puedes hacer un uso directo de las variables si pasas el nombre del data frame a la función attach
:
attach(datos)
temperatura # Ahora tenemos acceso directo a las variables
Si quieres deshabilitar el acceso directo, solo tienes que usar la función detach
:
detach(datos)
temperatura # Ya no puedes acceder a esta variable. Aparecerá un error.
Añadir columnas y filas a un data frame
A veces necesitas modificar los datos para agregar nuevas filas o columnas, o eliminarlas. Para los siguientes ejemplos, utilizaremos el conjunto de datos cars
, registrado en la década de 1920, que forma parte de los conjuntos de datos de ejemplo de R. Puedes cargarlo ejecutando data(cars)
. La base de datos contiene 50 filas y 2 variables:
- speed: velocidad (mph).
- dist: distancia de frenado (ft).
Si ejecutas head(cars)
obtendrás el siguiente resultado:
speed dist
1 4 2
2 4 10
3 7 4
4 7 22
5 8 16
6 9 10
Supón que quieres crear una nueva variable para transformar la velocidad en kilómetros por hora (km/h) y la distancia en metros. Recuerda que:
kilómetro = milla/0.62137 y metro = pie/3.2808
Entonces, ahora podrías agregar dos nuevas columnas llamadas kph
(kilómetros por hora) y meters
(metros) con el siguiente código:
cars$kph <- cars$speed / 0.62137
cars$meters <- cars$dist / 3.2808
También puedes hacer uso de la función cbind
. En caso de que quisieses agregar una nueva fila, podrías usar la función rbind
.
kph <- cars$speed / 0.62137
meters <- cars$dist / 3.2808
cars <- cbind(cars[, c(1, 2)], kph, meters)
Resultando en:
speed dist kph meters
1 4 2 6.437388 0.6096074
2 4 10 6.437388 3.0480371
3 7 4 11.265430 1.2192148
4 7 22 11.265430 6.7056815
5 8 16 12.874777 4.8768593
6 9 10 14.484124 3.0480371
Agrega nuevas filas con la función rbind
y nuevas columnas con la función cbind
.
Eliminar columnas y filas de un data frame
Ahora, si quieres borrar variables o filas de un data frame, tienes varias opciones:
- Usar el signo menos (-) e indicar las columnas o filas que quieras borrar.
- Crear un subconjunto de los datos que quieras conservar.
Como ejemplo, borraremos las variables speed
y dist
y para evitar sobrescribir el conjunto de datos original guardaremos nuestros resultados en un nuevo data frame llamado cars2
.
# Borrando la primera y segunda columna con el signo -
cars2 <- cars[, -c(1, 2)]
# Seleccionar solo las columnas que queremos conservar
cars2 <- cars[, c("kph", "meters")]
Si vuelves a utilizar la función head
, podrás ver el nuevo data frame.
head(cars2)
kph meters
1 6.437388 0.6096074
2 6.437388 3.0480371
3 11.265430 1.2192148
4 11.265430 6.7056815
5 12.874777 4.8768593
6 14.484124 3.0480371
Ordenando y filtrando datos de un data frame en R
Es habitual ordenar o filtrar los datos dentro de los data frames por los valores de alguna variable.
Ordenar data frames
Considera, como ilustración, el conjunto de datos mtcars
y cárgalos ejecutando data(mtcars)
. Podemos acceder al índice de ordenación de cualquier variable con la función order
.
ii <- order(mtcars$hp) # Índice de ordenación en base a la variable 'hp'
# (caballos de fuerza)
El vector de índices de ordenación establece el orden en que tienen que ser elegidas las filas del data frame para obtener la ordenación deseada.
# Ordenando por 'hp' (de más bajo a más alto)
# Solo mostramos las primeras 4 columnas
head(mtcars[ii, 1:4])
mpg cyl disp hp
Honda Civic 30.4 4 75.7 52
Merc 240D 24.4 4 146.7 62
Toyota Corolla 33.9 4 71.1 65
Fiat 128 32.4 4 78.7 66
Fiat X1-9 27.3 4 79.0 66
Porsche 914-2 26.0 4 120.3 91
También puedes ordenar de mayor a menor haciendo uso del signo menos.
ii <- order(-mtcars$hp)
head(mtcars[ii,])
mpg cyl disp hp
Maserati Bora 15.0 8 301 335
Ford Pantera L 15.8 8 351 264
Duster 360 14.3 8 360 245
Camaro Z28 13.3 8 350 245
Chrysler Imperial 14.7 8 440 230
Lincoln Continental 10.4 8 460 215
Además, puedes establecer diferentes condiciones para ordenar los datos. Puedes ordenar por alguna variable y, en caso de empate, ordenar por otra. En el siguiente ejemplo ordenaremos el data frame por la variable llamada cyl
y luego por la variable hp
.
ii <- order(mtcars$cyl, mtcars$hp)
head(mtcars[ii, 1:4])
mpg cyl disp hp
Honda Civic 30.4 4 75.7 52
Merc 240D 24.4 4 146.7 62
Toyota Corolla 33.9 4 71.1 65
Fiat 128 32.4 4 78.7 66
Fiat X1-9 27.3 4 79.0 66
Porsche 914-2 26.0 4 120.3 91
Filtrar data frames
Filtrar un data frame consiste en obtener una submuestra que cumpla con algunas condiciones. Para este propósito, puedes usar la función subset
para crear subconjuntos según los valores de alguna columna. Proporcionaremos algunos ejemplos basados en el conjunto de datos mtcars
:
Subconjunto donde el número de cilindros del automóvil es exactamente 6 y la potencia en caballos es mayor que 115.
subset(mtcars, cyl == 6 & hp > 115)
mpg cyl disp hp drat wt qsec vs am gear carb
Merc 280 19.2 6 167.6 123 3.92 3.44 18.3 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.44 18.9 1 0 4 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.77 15.5 0 1 5 6
Lo mismo que en el ejemplo anterior, pero solo mostramos las variables mpg
, cyl
y disp
utilizando el argumento select
.
subset(mtcars, cyl == 6 & hp > 115, select = c(mpg, cyl, disp))
mpg cyl disp
Merc 280 19.2 6 167.6
Merc 280C 17.8 6 167.6
Ferrari Dino 19.7 6 145.0
Ahora en lugar de utilizar la condición AND usaremos la condición OR. En este caso seleccionaremos los coches donde la variable wt
es menor que 2 o la variable hp
es mayor a 115.
subset(mtcars, wt < 2 | hp > 115)
mpg cyl disp hp drat wt qsec vs am gear carb
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8