Data frame en R

Introducción a R Estructuras de datos
Crea y trabaja con data frames 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:

  1. Usando el signo del dollar ($) y el nombre de la columna.
  2. 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:

  1. Crear una secuencia de índices.
  2. 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:

  1. Usar el signo menos (-) e indicar las columnas o filas que quieras borrar.
  2. 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