3.5 Tratamiento de datos con R
En este apartado se van a empezar a utilizar expresiones de R. Las expresiones se escribirán en scripts, que pueden contener “comentarios” (texto que no se ejecutará) utilizando el símbolo “almohadilla” (#). Muchas de las expresiones que se usan son llamadas a funciones.7 La ayuda de cualquier función se puede obtener en la consola usando la expresión ?function, donde function es el nombre de la función u objeto del que se quiere obtener ayuda.
3.5.1 Estructuras y tipos de datos
Las estructuras y tipos de datos más frecuentes con los que se trabaja en R son los que se detallan a continuación.
Tablas de datos. Son colecciones de variables numéricas y/o atributos organizadas en columnas, en las que cada fila se corresponde con algún elemento en el que se han observado las características que representan las variables. La forma más común es el data.frame. Cada columna del data.frame es, en realidad, otra estructura de datos, en concreto, un vector. Un ejemplo de data.frame es el conjunto de datos tempmin_data del paquete CDR que se analiza en el Cap. 40 y del que se muestran a continuación las primeras tres filas con la función head().
library("CDR")
head(tempmin_data, 3)
#> fecha indicativo tmin longitud latitud
#> 1 2021-01-06 4358X -4.7 -5.880556 38.95556
#> 2 2021-01-06 4220X -7.0 -4.616389 39.08861
#> 3 2021-01-06 6106X 4.7 -4.748333 37.02944Un data.frame es un objeto de datos en dos dimensiones, en el que las filas son la dimensión 1 y las columnas la dimensión 2. Los datos se pueden “extraer” de un data.frame por filas, por columnas o por celdas. Para extraer una de las variables del data.frame se suele utilizar el operador $ después del nombre del data.frame, y a continuación el nombre de la variable.
El operador <- asigna al “símbolo” que hay a su izquierda el resultado de la expresión que hay a su derecha, y lo guarda con ese nombre en el espacio de trabajo.8 Por ejemplo, la siguiente expresión extrae todas las filas de la columna tmin o, dicho de otra forma, el vector con todas las temperaturas mínimas registradas y lo guarda en el objeto temp_min.
temp_min <- tempmin_data$tminVectores y matrices. Ya se ha visto que una columna de una tabla de datos es un vector. También se pueden crear vectores con la función c() y los elementos del vector separados por comas. Una matriz es un vector organizado en filas y columnas. A modo de ejemplo, la primera de las siguientes expresiones crea un vector llamado nombres con dos cadenas de texto, y la segunda crea una matriz numérica llamada coordenadas a partir de las columnas 4 y 5 del conjunto de datos tempmin_data. Nótese que la extracción de valores de un conjunto de datos o de una matriz se puede realizar también por sus índices de filas y columnas entre corchetes separados por una coma. En este caso se extraen todas las filas (pues no se especifica ninguna en la dimensión 1) de las columnas 4 y 5.
nombres <- c("longitud", "latitud")
coordenadas <- as.matrix(tempmin_data[, 4:5])Factor. Es un tipo especial de vector para representar variables categóricas (también denominadas atributos o factores). En general, una variable categórica suele tomar un número reducido de valores diferentes (categorías), identificados con etiquetas (labels) y que se llaman niveles del factor (levels). Un ejemplo es el dataset dp_entr del paquete CDR que se analiza en el Cap. 24. La columna ind_pro11 es un indicador que toma los valores S y N, mientras que des_nivel_edu toma tres posibles valores.
dp_entr[1:5, c(1, 17)]
#> ind_pro11 des_nivel_edu
#> 1 S MEDIO
#> 497 N MEDIO
#> 265 N BASICO
#> 534 N MEDIO
#> 415 N BASICO
levels(dp_entr$des_nivel_edu)
#> [1] "ALTO" "BASICO" "MEDIO"Listas. Son estructuras de datos que contienen una colección de elementos indexados que, además, pueden tener un nombre. Pueden ser heterogéneas, en el sentido de que cada elemento de la lista puede ser de cualquier tipo.
A modo de ejemplo, se muestran los nombres del objeto tempmax_data del paquete CDR, que contiene seis elementos de distintas clases.
names(tempmax_data)
#> [1] "ESP" "ESP_utm" "grd_sf" "grd_sp"
#> [5] "temp_max_utm_sf" "temp_max_utm_sp"Fechas. Son un tipo de datos especial que algunas veces provoca problemas al compartir datos entre programas. El conjunto de datos tempmin_data contiene la columna fecha, que puede convertirse de manera inmediata a tipo fecha (Date) porque viene en un formato estándar (véase la ayuda de strptime para especificar otros formatos). El paquete lubridate del tidyverse contiene funciones para hacer más fácil el trabajo con fechas.
tempmin_data$fecha<- as.Date(tempmin_data$fecha)
class(tempmin_data$fecha)
#> [1] "Date"Cadenas de texto. Son estructuras de datos que aparecen en forma de vector de caracteres. La columna indicativo del conjunto de datos tempmin_data es un ejemplo de este tipo de datos. La ayuda de ?regexpr proporciona la información necesaria sobre cómo extraer texto con expresiones regulares, y la de ?paste, para aprender a unir cadenas de texto. El paquete stringr del tidyverse contiene funciones para facilitar el trabajo con cadenas de texto.
head(tempmin_data$indicativo)
#> [1] "4358X" "4220X" "6106X" "9698U" "4410X" "1331A"3.5.2 Importación de datos
En el apartado anterior se han utilizado tablas de datos que están incluidas en un paquete de R. Pero lo habitual es que los datos se tengan que importar de fuentes externas, como ficheros. A continuación, se describen algunas de las formas de importar los tipos de ficheros más habituales.9
Excel. Sin duda una forma muy popular de organizar los datos en ficheros es mediante hojas de cálculo como Microsoft Excel. Hay varios paquetes con los que se puede trabajar con archivos de Excel. En este libro se utiliza el paquete readxl del tidyverse. Con la siguiente expresión se puede descargar un archivo Excel de ejemplo.10
download.file(url = "http://emilio.lcano.com/b/adr/p/datos/RRHH.xlsx",
destfile = "data/RRHH.xlsx",
mode = "wb")Una vez el archivo está en el directorio de trabajo de la sesión de R, se puede importar su contenido al espacio de trabajo con la siguiente expresión:
rrhh <- readxl::read_excel("data/RRHH.xlsx")Texto. Los archivos de texto son el formato más utilizado y conveniente para compartir datos. Es también muy común que el equipamiento o el software genere datos en formato de texto. Estos archivos suelen tener extensión .csv (comma separated values) o .txt, aunque pueden tener cualquier otra, o incluso no tener extensión. A modo de ejemplo, con la siguiente expresión se puede descargar un archivo csv.
download.file(url = "http://emilio.lcano.com/b/adr/p/datos/ejDatos.csv",
destfile = "data/ejDatos.csv")Si el archivo tiene extensión .csv, como el anterior, vendrá ya con una especificación muy concreta, pudiéndose usar directamente las funciones read.csv() o read.csv2() para tener la tabla de datos en el espacio de trabajo.
merma <- read.csv2("data/ejDatos.csv")La función genérica de R para importar datos de texto es read.table(), que puede importar cualquier especificación cambiando los argumentos adecuados. Por ejemplo, la siguiente expresión tendría el mismo resultado que se ha obtenido con la función read.csv2:11
merma <- read.table(file = "data/ejDatos.csv",
header = TRUE,
sep = ";",
dec = ",",
fileEncoding = "utf-8")Hay infinidad de otras fuentes de las que se pueden importar datos a R. Por ejemplo, el paquete rvest, que forma parte del tidyverse, se puede utilizar para obtener datos de páginas web y otras fuentes de Internet, lo que se suele llamar web scraping. Por ejemplo, supóngase que se quiere importar la tabla con los datos de comunidades y ciudades autónomas españolas del enlace https://www.ine.es/daco/daco42/codmun/cod_ccaa_provincia.htm. Las siguientes expresiones importan esta tabla al conjunto de datos ccaa_ine.
library("rvest")
url <- "https://www.ine.es/daco/daco42/codmun/cod_ccaa_provincia.htm"
ccaa_ine <- url |>
read_html() |>
html_node(xpath = '//*[@id="contieneHtml"]/table') |>
html_table(fill = TRUE)La ruta o “xpath” se puede obtener usando las herramientas de desarrollo del navegador, y puede que una vez importada la tabla se requiera algún postprocesamiento antes de poder analizar los datos.
3.5.3 Exportación de datos y archivos de datos específicos de R
En algunos proyectos es necesario guardar ciertos datos que se han ido creando o transformando, bien para compartir con otras partes interesadas, bien para ser utilizados en el mismo u otros proyectos. Para exportar los datos a Excel, se utiliza la función write.xlsx() del paquete openxlsx (si no está instalado, se instala de la forma habitual). Si lo que se quiere es exportarlo a texto, se pueden utilizar los equivalentes a las funciones de importación write.csv(), write.csv2() o write.table().
La siguiente expresión exporta la tabla de datos tempmin_data a ficheros Excel y csv (formato en inglés).
openxlsx::write.xlsx(x = tempmin_data,
file = "data/temp_min_Filomena.csv")
write.csv(x = tempmin_data, file = "data/temp_min_Filomena.csv")También se pueden guardar los datos en formato “nativo” de R. Los archivos .RData almacenan un espacio de trabajo entero, y por tanto pueden guardar varios objetos en el mismo archivo. Cuando posteriormente se importe, los objetos estarán en el espacio de trabajo con su nombre original. Se guardan con la función save() y se restauran con la función load(), como en el siguiente ejemplo.
save(tempmin_data, tempmax_data,
file = "data/datos_temperaturas.RData")
load("data/datos_temperaturas.RData") #carga de nuevo el objetoLos archivos .rds almacenan un único objeto en un archivo. Cuando posteriormente se quieran importar, hay que asignar el resultado al nombre que se quiera. Se guardan con la función writeRDS() y se restauran con la función readRDS(), como en el siguiente ejemplo.
saveRDS(object = tempmin_data,
file = "data/datos_temperaturas.rds")
nuevo_objeto <- readRDS(file = "data/datos_temperaturas.rds")El paquete foreign de R base y otros paquetes especializados pueden exportar datos a otros formatos de archivo, que no se tratan en detalle en este capítulo.