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.