4.3 Iteración
En análisis de datos es común implementar rutinas iterativas, esto es, cuando debemos aplicar los mismos pasos a distintas entradas.
medias <- numeric()
for (i in 1:5){
medias[i] <- wtd_mean(df[, i])
}
medias
#> [1] 5.5000000 0.1115946 -0.5735497 0.1876759 -0.1062314
Recordando la limpieza de datos de la clase pasada el
vector paths
contenía la ruta a distintos archivos csv. Crea la tabla de datos
final usando un ciclo for
.
paths <- dir("data/specdata", pattern = "\\.csv$", full.names = TRUE)
Es muy común tener que iterar sobre un vector, modificando cada entrada y
guardando los resultados en una nueva estructura, es por ello que hay funciones
para realizar esto en R de manera más clara. Por ejemplo, R base existen
lapply()
, apply()
, sapply()
.
Por su parte, el paquete purrr
del tidyverse provee una familia de funciones
para esta misma función.
map()
devuelve una lista.map_lgl()
devuelve un vector lógico.map_int()
devuelve un vector entero.map_dbl()
devuelve un vector double.map_chr()
devuelve un vector caracter.
Todas las funciones reciben un vector, aplican una función a cada parte y regresan un nuevo vector de la misma longitud que el vector entrada.
library(purrr)
names(paths) <- basename(paths)
specdata_us_vec <- map(paths, ~readr::read_csv(., col_types = "Tddi"),
.id = "filename")
specdata_us_vec[[10]]
#> # A tibble: 1,096 x 4
#> Date sulfate nitrate ID
#> <dttm> <dbl> <dbl> <int>
#> 1 2002-01-01 00:00:00 NA NA 10
#> 2 2002-01-02 00:00:00 NA NA 10
#> 3 2002-01-03 00:00:00 NA NA 10
#> 4 2002-01-04 00:00:00 NA NA 10
#> 5 2002-01-05 00:00:00 NA NA 10
#> 6 2002-01-06 00:00:00 NA NA 10
#> 7 2002-01-07 00:00:00 NA NA 10
#> 8 2002-01-08 00:00:00 NA NA 10
#> 9 2002-01-09 00:00:00 NA NA 10
#> 10 2002-01-10 00:00:00 NA NA 10
#> # ... with 1,086 more rows
class(specdata_us_vec)
#> [1] "list"
En este caso es más apropiado usar map_df
specdata_us <- map_df(paths, ~readr::read_csv(., col_types = "Tddi"),
.id = "filename")
Utiliza map_*** para crear un vector con la media de
nitrato de cada estación de monitoreo, itera sobre el vector specdata_us_vec
.