GOOGLE ADS

lunes, 18 de abril de 2022

Usando un bucle for para crear múltiples parcelas

Soy un novato en el uso de bucles y en la simplificación de mi código. Tengo un conjunto de datos de lugares con datos adjuntos que me gustaría trazar en mapas separados. El trazado individual de los mapas lo puedo hacer. Sin embargo, me gustaría automatizar un poco el proceso, tengo nuevos datos que llegan todos los días y no quiero repetir el proceso de limpieza de datos y reescritura de código. Así que pensé que un forbucle podría ser la respuesta.

Lo que necesito son gráficos separados para cada uno Timede los datos a continuación. De modo que el bucle extraiga todos los datos para cada valor Timey luego los represente.

dput(df) 
structure(list(Site = c("O242", "O51", "O59", "O71", "C110",
"C116", "C120", "C13", "C132", "C134", "C139", "C140", "C29",
"C30", "C33", "C48", "C56", "C9A", "MP25", "MP67", "B30", "MP2",
"B101", "B11", "B112", "B15", "B197", "B2", "B217", "B22", "B30",
"B95", "MP21", "MP25", "MP33", "MP51", "MP56", "MP6", "MP60",
"MP61", "MP67", "MP77", "EX84", "EX92", "SW130", "O31", "O38",
"O38B", "O48", "O58", "O59", "O68", "O71", "O72", "O81", "O94",
"O207", "O209", "O210", "O215"), Time = c(-25, -22, -22, -22,
-14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14,
-14, -23, -23, -20, -20, -11, -11, -11, -11, -11, -11, -11, -11,
-11, -11, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
-10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
-10, -10, -10, -10), Code = c(1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L,
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 3L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 3L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L,
1L, 1L, 1L, 2L, 1L, 2L, 1L, 3L, 2L, 1L, 3L, 1L, 1L, 3L, 2L, 2L,
3L, 1L, 1L, 2L), lon = c(-1.341280663, -1.343562025, -1.343620358,
-1.340629756, -1.332551665, -1.329108814, -1.328655294, -1.330835311,
-1.330715028, -1.33052464, -1.328144549, -1.328287425, -1.329353862,
-1.329343236, -1.33041446, -1.325353001, -1.327279282, -1.332909331,
-1.300122834, -1.299148682, -1.310197641, -1.305886812, -1.308725397,
-1.309505208, -1.309235075, -1.308580716, -1.30959055, -1.308685087,
-1.309426224, -1.306562029, -1.310197641, -1.307564253, -1.301598673,
-1.300122834, -1.299510666, -1.299846899, -1.297823339, -1.305388627,
-1.297220016, -1.297398331, -1.299148682, -1.300378324, -1.333554619,
-1.338688389, -1.332015649, -1.344951753, -1.344769267, -1.345214102,
-1.342514477, -1.343145083, -1.343620358, -1.34275518, -1.340629756,
-1.339067762, -1.338035147, -1.335442485, -1.346461847, -1.34550727,
-1.34516939, -1.346584124), lat = c(51.76635545, 51.76553293,
51.76450781, 51.76428383, 51.75689245, 51.75615401, 51.75742817,
51.75637019, 51.75666667, 51.75740286, 51.7596281, 51.75976378,
51.75721637, 51.75695556, 51.75701561, 51.75871255, 51.75875955,
51.75720018, 51.76339382, 51.75986347, 51.76597134, 51.76737513,
51.76464054, 51.76481595, 51.76542577, 51.76557477, 51.76682149,
51.7644335, 51.76714421, 51.76681267, 51.76597134, 51.76571265,
51.76447255, 51.76339382, 51.76268887, 51.76062289, 51.76030512,
51.76678776, 51.75996884, 51.75968219, 51.75986347, 51.75998767,
51.76749876, 51.76822905, 51.76474771, 51.76863319, 51.76622254,
51.7655237, 51.76482531, 51.76430735, 51.76450781, 51.76421526,
51.76428383, 51.76308822, 51.76434118, 51.76525265, 51.76642077,
51.7672966, 51.76661139, 51.76598088)), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -60L), groups = structure(list(
Time = c(-25, -23, -22, -20, -20, -14, -14, -11, -11, -11,
-10, -10, -10), Code = c(1L, 1L, 1L, 1L, 3L, 1L, 2L, 1L,
2L, 3L, 1L, 2L, 3L),.rows = structure(list(1L, 19:20, 2:4,
22L, 21L, c(7L, 8L, 11L, 12L, 13L, 14L, 15L, 16L, 17L
), c(5L, 6L, 9L, 10L, 18L), 23:30, 32L, 31L, c(33L, 35L,
41L, 42L, 43L, 45L, 47L, 50L, 52L, 53L, 58L, 59L), c(34L,
36L, 37L, 38L, 39L, 40L, 44L, 46L, 49L, 55L, 56L, 60L
), c(48L, 51L, 54L, 57L)), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -13L),.drop = TRUE))

Si tuviera que hacer esto a mano, usaría dplyr::filter(Time == "x")luego hacer cada trama usando leafletasí

install.packages("leaflet")
library(leaflet)
statecol<- colorFactor(palette = "viridis", df$Code) #create the colour palette
plots<- leaflet() %>% setView(lng = -1.324640, lat = 51.770462, zoom = 13.25)
plots %>% addTiles() %>%
addCircleMarkers(data = df, label = ~as.character(df$Site), radius = 5, color = ~statecol(Code), stroke = FALSE, fillOpacity = 5) %>%
addLegend('bottomright', pal = statecol, values = df$Code,
title = 'Codes',
opacity = 2)

Si hay una solución mejor que un bucle, también me encantaría intentarlo. Espero haber quedado claro y gracias de antemano


Solución del problema

Un enfoque sería poner el código de trazado en una función que toma como único argumento un marco de datos. Para hacer un mapa para cada valor único de Timeusted, podría luego splitsus datos Timey recorrer el conjunto de datos dividido usando la función de trazado, donde en lugar de un bucle for yo uso lapply. Como resultado, obtiene una lista con gráficos para cada valor de Time:

library(leaflet)
library(dplyr)
df_split <- df %>%
ungroup() %>%
split(.$Time)
statecol<- colorFactor(palette = "viridis", df$Code) #create the colour palette
plot_fun <- function(x) {
leaflet() %>%
setView(lng = -1.324640, lat = 51.770462, zoom = 13.25) |>
addTiles() %>%
addCircleMarkers(data = x, label = ~as.character(x$Site), radius = 5, color = ~statecol(Code), stroke = FALSE, fillOpacity = 5) %>%
addLegend('bottomright', pal = statecol, values = x$Code,
title = 'Codes',
opacity = 2)
}
plots <- lapply(df_split, plot_fun)
length(plots)
#> [1] 7
plots[[1]]

EDITAR En caso de que quiera conservar o usar los datos de gráficos anteriores, básicamente podríamos usar el mismo código con un pequeño cambio, es decir, recorrer un índice y combinar ( rbind) los conjuntos de datos hasta el valor del índice dentro de la función de trazado:

library(leaflet)
library(dplyr)
df_split <- df %>%
ungroup() %>%
split(.$Time)
statecol<- colorFactor(palette = "viridis", df$Code) #create the colour palette
plot_fun <- function(ix) {
x <- do.call(rbind, df_split[seq(ix)])
leaflet() %>%
setView(lng = -1.324640, lat = 51.770462, zoom = 13.25) |>
addTiles() %>%
addCircleMarkers(data = x, label = ~as.character(x$Site), radius = 5, color = ~statecol(Code), stroke = FALSE, fillOpacity = 5) %>%
addLegend('bottomright', pal = statecol, values = x$Code,
title = 'Codes',
opacity = 2)
}
plots <- lapply(seq_along(df_split), plot_fun)
plots[[3]]

plots[[5]]

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...