Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante
Un análisis de datos adecuado requiere (mucho) tiempo de trabajo “sucio”
tidyverse
incluye una colección de bibliotecas con herramientes eficientes para el proceso de “tratamiento de datos” (“data wrangling”)
El objetivo es tener un conjunto de datos ordenado y limpio para poder realizar análisis de manera eficiente
Esto puede requerir seleccionar columnas, filtrar filas, crear nuevas variables, ordenar, agrupar, resumir, etc.
1.- Cada columna es una variable: mide el mismo atributo entre unidades
2.- Cada fila es una observación (caso): misma unidad a través de atributos
3.- Cada celda es un valor
tidyverse
es eficiente con datos ordenados: ej., gráfico temporalLa mayoría de operaciones pueden realizarse combinando 5 “verbos”
Todos tienen como primer argumento un data frame, los siguientes describen qué hacer (con columnas o filas) y devuelven otro data frame
1.- select()
: selecciona variables por nombres o posiciones de columnas, separados por comas
2.- filter()
: conserva filas en las que la condición lógica es verdadera
%>%
datos %>% filter(condition)
equivale a filter(datos, condition)
El anidamiento es fácil:
presidential
y pasarlo a filtrar (produce un nuevo data frame);
Atajo de teclado: Cmd / Ctrl + Mays + M
Se puede aplicar a cualquier función: 10 %>% log()
es log(10)
También existe una tubería en R base: |>
3.-mutate()
: añade nuevas columnas, creando variables según una fórmula a partir de otras
también rename()
: cambiar el nombre de una columna
4.- arrange()
: re-ordena las filas todas las columnas de un data frame
desc()
5.- summarize()
: colapsa valores de un data frame en una sola fila resumen
summarize()
suele usarse en conjunción con group_by()
group_by()
group_by()
: cambia el alcance de cada función para que no actúe sobre todo el data frame sino en grupos individuales
¿Cuál es la duración media de los demócratas y de los republicanos? Hacerlo por separado no es eficiente: especificamos que las filas deben ser agrupadas
ungroup()
elimina la agrupación: volvemos a operar en datos desagrupadosselect()
:
starts_with("abc")
: nombres que comienzan con “abc”.ends_with("xyz")
: nombres que acaban con “xyz”.contains("ijk")
: nombres que contienen “ijk”.num_range("x", 1:3)
: para x1, x2 y x3.matches()
: nombres que coinciden con una expresión regularslice()
, slice_sample()
: extrae filas por posición o aleatoriamentedrop_na()
y replace_na()
: elimina filas con valores ausentes o los reemplaza
distinct()
: extrae sólo las filas únicas (una o varias variables)
count()
: cuenta los valores únicos de una o más variablesacross()
: aplica la misma transformación a múltiples columnasOperadores aritméticos (+
, -
, *
, /
, ^
, %/%
, %%
) y lógicos (<
, <=
, >
, >=
, !=
)
Funciones como log()
, lag()
, lead()
, cumsum()
, row_number()
etc.
if_else()
: ejecución condicional (también case_when()
)cut_interval()
, cut_number()
, cut_width()
Nota: dplyr
tiene muchas funciones equivalentes a otras de R base:
parse_number()
, parse_factor()
, etc. por as.number()
, as.factor()
, etc.bind_cols()
y bind_rows()
por cbind()
y rbind()
Medidas de centralidad y de dispersión: mean(x)
, median(x)
, sd(x)
, IQR(x)
Medidas de rango: min(x)
, quantile(x, 0.25)
, max(x)
Medidas de posición: first(x)
, nth(x, 2)
, last(x)
.
Conteos:
n()
: observaciones totales (tamaño del grupo)
sum(!is.na(x))
: observaciones no ausentes
n_distinct(x)
: filas distintas en x
La utilidad de almacenar los datos en un rectángulo ancho (“wide”) o en uno largo (“long”“) depende de qué queramos hacer
El cambio de forma entre formatos es una tarea habitual del analista de datos.
Cambiar entre representación larga y ancha se conoce como pivotar (o girar)
pivot_longer()
: de ancho a largodata frame a cambiar de forma
nombres o índices de las columnas que representan valores, no variables
los nombres de esas antiguas variables van como valores a nueva variable
los valores de las antiguas celdas van a otra nueva variable
pivot_longer()
: de ancho a largo (cont.)pivot_wider()
: de largo a anchoseparate()
: dividir una columna en múltiples variables indicando un separador o vector de posiciones en las que dividirconvert = TRUE
intenta convertir el tipo (no mantener carácter)unite()
: combinar múltiples columnas en una