Menu

Data frames en R: crear, inspeccionar y acceder a columnas

El data frame es la hoja de cálculo de R: columnas con nombre de igual longitud, cada una con su propio tipo. Cómo construir uno, hacerte una idea con str() y head(), y llegar a columnas, filas y celdas.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Un data frame es una lista de columnas

Un data frame es la tabla de R: filas de observaciones, columnas de variables. Es la hoja de cálculo de R y la forma en la que llegan prácticamente todos los datos reales - una fila por persona, por medición, por transacción; una columna por atributo.

Estructuralmente, un data frame es una lista de vectores de igual longitud con un comportamiento de filas y columnas encima. Ese único hecho explica la mayoría de sus reglas: cada columna tiene un solo tipo (es un vector), columnas distintas pueden tener tipos distintos (es una lista) y todas las columnas deben tener la misma longitud (esa es la parte del "marco").

Construyes uno pasando vectores con nombre a data.frame():

Texto, números y lógicos conviviendo - la mezcla que una matriz no puede contener. En la práctica raras veces escribirás los datos a mano así; las tablas suelen llegar mediante read.csv o una base de datos. Pero todo lo que sigue se aplica igual venga de donde venga el data frame.

Hacerte una idea de un data frame

Nunca calcules sobre un conjunto de datos que no hayas mirado. El kit de inspección de R es corto y merece la pena convertirlo en reflejo:

  • str() es la primera que hay que ejecutar sobre cualquier dato recién cargado: una línea por columna con su tipo y sus primeros valores. Es donde cazas esa columna de "números" que en realidad se leyó como carácter por una entrada despistada.
  • nrow() / ncol() dan las dimensiones; names() lista los nombres de columna.
  • summary() da estadísticas por columna - mínimo/mediana/media/máximo para números, recuentos para lógicos y factores.
  • head(df) y tail(df) imprimen las primeras y las últimas seis filas - indispensables en cuanto los conjuntos de datos reales se vuelven demasiado grandes para imprimirlos enteros. Verás head() en acción más abajo sobre un conjunto de datos incorporado.

Tres formas de obtener una columna

El acceso a columnas es la operación del día a día, y R te da tres grafías:

  • people$age - la forma cotidiana: corta, legible y con autocompletado en la mayoría de editores.
  • people[["age"]] - resultado idéntico, pero el nombre puede venir de una variable (col <- "age"; people[[col]]), algo que $ no puede hacer. Prefiérela dentro de funciones.
  • people[, "age"] - al estilo de las matrices: filas antes de la coma (vacío = todas), columnas después.

Las tres devuelven la columna como un vector normal, listo para mean(people$age). La cuarta grafía del fragmento es la trampa: people["age"] con corchetes simples devuelve un data frame de una columna, no un vector - la misma distinción entre [ y [[ que tienen las listas, porque un data frame es una lista. Si una función matemática se queja de que tu entrada no es numérica, revisa los corchetes.

Filas y celdas

La notación [fila, columna] alcanza cualquier trozo de la tabla:

people[2, ] es toda la segunda fila (como un data frame de una fila - las filas conservan su marco, ya que mezclan tipos). people[2, "name"] es una sola celda. Un vector de números de fila extrae varias filas.

La última línea es la importante: una condición lógica sobre una columna selecciona filas - aquí, todos los mayores de 28. Este patrón de enmascarar filas es la base de todo el filtrado de datos en R, y merece su propio artículo: mira filtrar y hacer subconjuntos para el tratamiento completo, incluidos subset() y los filtros con varias condiciones.

Añadir y eliminar columnas

Como un data frame es una lista de columnas, las columnas van y vienen con asignaciones normales:

Asignar a un nombre nuevo añade la columna; el vector debe coincidir con nrow() (o tener longitud 1, que se recicla para rellenar todas las filas). La segunda adición muestra el movimiento idiomático: columnas nuevas calculadas a partir de las existentes, usando cálculos vectorizados sobre toda la columna a la vez. Asignar NULL borra una columna por completo.

Los valores de una columna se pueden sobrescribir del mismo modo - people$age <- people$age + 1 les echa un año a todos.

Conjuntos de datos incorporados y unas palabras sobre los tibbles

R viene con conjuntos de datos de práctica precargados, así que puedes probar todo lo anterior sin importar nada. Los dos que encontrarás en todos los tutoriales son mtcars (32 coches, 11 variables numéricas) e iris (150 flores, 4 medidas más un factor de especie):

head() ganándose el sueldo: seis filas te dicen la forma del asunto sin inundar la pantalla. Estos conjuntos de datos son campos de juego ideales - cuando no estés seguro de cómo se comporta alguna función, pruébala en mtcars antes de apuntarla a tus propios datos.

Un término que encontrarás en cuanto toques el tidyverse: el tibble, la versión del data frame del tidyverse. Mismo concepto, comportamiento más educado - al imprimir solo muestra las primeras diez filas con los tipos de columna, y no hay coincidencia parcial de nombres. Se crea con tibble() o lo devuelven las funciones de readr/dplyr:

library(tibble)
tibble(name = c("Rosa", "Ken"), age = c(30, 41))
#> # A tibble: 2 x 2
#>   name    age
#>   <chr> <dbl>
#> 1 Rosa     30
#> 2 Ken      41

Todo lo de este artículo - $, str(), añadir columnas, máscaras lógicas de filas - funciona igual sobre los tibbles. Un tibble es un data frame con algo de barniz extra; aprende los data frames y habrás aprendido ambos.

Lo que te llevas

  • Un data frame es una lista de columnas de igual longitud: un tipo por columna, tipos mezclados a lo ancho de la tabla - la hoja de cálculo de R.
  • Inspecciona antes de calcular: str() primero, luego head(), summary(), nrow()/ncol()/names().
  • df$col, df[["col"]] y df[, "col"] devuelven una columna como vector; df["col"] con corchete simple devuelve un data frame.
  • df[filas, columnas] extrae cualquier trozo; una máscara lógica antes de la coma filtra filas.
  • Añade columnas por asignación (a menudo calculadas a partir de otras columnas); elimínalas con NULL; practica con mtcars.

Lo siguiente: los valores ausentes - qué significa NA, por qué se propaga por los cálculos y cómo manejarlo.

Preguntas frecuentes

¿Cómo se crea un data frame en R?

Pasa vectores con nombre y de igual longitud a data.frame(): df <- data.frame(name = c("Rosa", "Ken"), age = c(30, 41)). Cada vector se convierte en una columna. En la práctica, la mayoría de los data frames no se escriben a mano - llegan desde read.csv() o una base de datos -, pero la estructura es la misma.

¿Cómo se accede a una columna de un data frame en R?

De tres formas: df$age (rápida y legible), df[["age"]] (mismo resultado, funciona cuando el nombre de la columna está guardado en una variable) y df[, "age"] (al estilo de las matrices). Las tres devuelven la columna como un vector normal. df["age"] con corchetes simples devuelve en cambio un data frame de una columna - una fuente frecuente de confusión.

¿Qué muestra str() para un data frame?

Una línea por columna: su nombre, su tipo y los primeros valores, además del número de filas y columnas arriba. Es la forma más rápida de ver si una columna se leyó como numérica o como texto, y por eso str() debería ser lo primero que ejecutes sobre cualquier conjunto de datos recién cargado.

¿Cómo se añade una columna a un data frame en R?

Asigna a un nombre que todavía no exista: df$score <- c(88, 75, 93). El vector debe coincidir con el número de filas (o tener longitud 1, que se recicla a todas las filas). Elimina una columna asignándole NULL: df$score <- NULL.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR