2018-06-18

Mapa coroplético de España con leaflet para R

Problema

Crear un mapa coroplético con leaflet es muy sencillo. En nuestro ejemplo, crearemos un mapa coroplético de España con el número de habitantes por provincia. El resultado final es este:

Solución

  1. Obtener datos espaciales
  2. Necesitamos obtener datos espaciales (df_pol, un SpatialPolygonDataFrame) para añadir los polígonos con los bordes de las regiones al mapa.

    library(leaflet)
    library(dplyr)
    library(RColorBrewer)
    
    df_pol <- readRDS("ESP_adm2.rds")
    
  3. Obtener datos poblacionales
  4. Descargamos los datos poblacionales (df_pob) para colorear el mapa. Los descargamos del INE.

    df_pob <-  read.csv2("2852sc.csv", dec = ".", stringsAsFactors = FALSE)
    
  5. Unimos ambos
  6. Antes de unir df_pol y df_pob, tenemos que manipular los nombres de las provincias, pues los nombres de ambos ficheros no coinciden (omito este paso).

    df_spain <- merge(df_pol, df_pob, by.x = 'NAME_2', by.y = 'Provincia', all.x = TRUE)
    
  7. Paleta de colores y etiquetas
  8. Creamos una paleta dividiendo la población en 5 intervalos.

    # Paleta
    bins <-  quantile(df_spain$Población, probs = c(0, 0.2, 0.4, 0.6, 0.8, 1))) 
    pal <- colorBin("YlOrRd", domain = ~ Población, bins = bins)
    # Etiquetas
    labels <- sprintf(
      "<strong>%s</strong><br/>%s Habitantes",
      df_spain@data$NAME_2,
      format(
        df_spain@data$Población,
        big.mark = ".",
        decimal.mark = ","
      )
    ) %>% lapply(htmltools::HTML)
    
  9. Creamos el mapa
  10. Añadimos todos los elementos al mapa. Centramos el mapa, añadimos el color de la paleta en función de la población, controlamos la opacidad, y finalmente añadimos la leyenda.

    
    m <- leaflet(df_spain) %>%
      setView(lng = -3.7, lat = 40.4, zoom = 06) %>%
      addTiles() %>%
      addPolygons(fillColor = ~pal(Población),
                  weight = 2,
                  opacity = 0.2,
                  color = "#FD8D3C",
                  dashArray = "3",
                  fillOpacity = 0.6,
                  highlight = highlightOptions(
                    weight = 5,
                    color = "#666",
                    dashArray = "",
                    fillOpacity = 1,
                    bringToFront = TRUE),
                  label = labels,
                  labelOptions = labelOptions(
                    style = list("font-weight" = "normal", padding = "3px 8px"),
                    textsize = "15px",
                    direction = "auto"))  %>% 
      addLegend(pal = pal,values =  ~ Población,
                position = "bottomright",
                opacity = 1,
                title = "Población")
    m
    

Entradas relacionadas

2018-06-12

Mostrar fechas como días de la semana en otros idiomas

Problema

En Excel, queremos mostrar las fechas como los días de la semana en otros idiomas.

Solución

  • Empleamos la función TEXTO especificando el identificador de idioma correspondiente precedido de "$-".

  • =TEXTO(A2;"[$-040a]dddd")  ' Español
    =TEXTO(A2;"[$-809]dddd")    ' Inglés
    =TEXTO(A2;"[$-040c]dddd")   ' Francés
    =TEXTO(A2;"[$-407]dddd")    ' Alemán
    

Entradas relacionadas

Referencias

2018-06-10

Mostrar la fecha como el día de la semana

Problema

En Excel, queremos mostrar las fechas como los días de la semana.

Solución

  1. Seleccionamos las celdas y presionamos Ctrl+1 para acceder al Formato de celdas, pestaña de Número.
  2. En la categoría Personalizada tecleamos ddd para mostrar las abreviaturas de los nombres (lun, mar, mié, etc.), o dddd para mostrar el nombre completo (lunes, martes, etc.).
  • Otra alternativa es emplear la función TEXTO.
  • =TEXTO(A1;"ddd")
    =TEXTO(A1;"dddd")
    

Entradas relacionadas

2018-05-19

Muestra aleatoria estratificada proporcional en R

Problema

Necesitamos crear una muestra estratificada en R. Nuestro data frame contiene dos estratos con un 60% y 40% respectivamente del total de la población. Deseamos estraer una muestra de 10 en la que cada estrato esté representado proporcionalmente: 60% (6 elementos) del estrato 1 y un 40% (4 elementos) del estrato 2.

id <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
estrato<- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2)
df <- data.frame(id, estrato)
df %>%
  group_by(estrato) %>%
  summarise (cuenta = n()) %>%
  mutate(porcentaje = cuenta / sum (cuenta ))
# A tibble: 2 x 3
  estrato cuenta porcentaje
            
1      1.     12      0.600
2      2.      8      0.400

Solución

Muestro tres soluciones diferentes. Las dos primeras son muy similares entre sí — con dplyr encadenamos las expresiones con el operador %>% — y arrojan el mismo resultado. Finalmente empleamos el paquete caret.

  1. Paquete splitstackshape
  2. library(splitstackshape)
    set.seed(1)
    stratified(df, "status", 10 / nrow(df))
    
        id estrato
     1:  4       1
     2:  5       1
     3:  6       1
     4:  9       1
     5:  2       1
     6:  7       1
     7: 20       2
     8: 17       2
     9: 16       2
    10: 13       2
    
  3. Paquete dplyr
  4. library(dplyr)
    set.seed(1)
    df %>%
      group_by(estrato) %>%
      sample_frac(10 / nrow(df))
    
    # A tibble: 10 x 2
    # Groups:   estrato [2]
          id estrato
          
     1    4.      1.
     2    5.      1.
     3    6.      1.
     4    9.      1.
     5    2.      1.
     6    7.      1.
     7   20.      2.
     8   17.      2.
     9   16.      2.
    10   13.      2.
    
  5. Paquete caret
  6. library(caret)
    set.seed(1)
    train.index <- createDataPartition(df$estrato,
                                       p = .5,
                                       list = FALSE)
    df[train.index, ]
    
       id estrato
    1   1       1
    4   4       1
    6   6       1
    8   8       1
    9   9       1
    11 11       1
    14 14       2
    15 15       2
    16 16       2
    19 19       2
    

Referencias

2018-04-25

Calcular la diferencia entre filas alternas en R

Problema

Queremos calcular la diferencia entre filas alternas en R.

df <- 
structure(list(MemId = c(1, 2, 3, 4, 5,6), ET = structure(c(1506829256,
 1506829319, 1506843096,1506843226, 1506850144, 1506853708), class = 
c("POSIXct", "POSIXt"))), .Names = c("MemId", "ET"), row.names = c("1",
 "2", "14", "15", "37", "38"), class = "data.frame")
  MemId                  ET
1      1 2017-10-01 05:40:56
2      2 2017-10-01 05:41:59
14     3 2017-10-01 09:31:36
15     4 2017-10-01 09:33:46
37     5 2017-10-01 11:29:04
38     6 2017-10-01 12:28:28

Solución

Creamos una columna auxiliar con ceros y unos. Y con la función difftime, calculamos para los unos la diferencia entre un momento en el tiempo (ET) y el anterior (lag(ET)).

library(dplyr)
df %>%
  mutate(id = rep_len(0:1, nrow(df))) %>%
  mutate(dif = ifelse(id == 1, difftime(ET, lag(ET), units = "secs"), NA))
  MemId                  ET id  dif
1     1 2017-10-01 05:40:56  0   NA
2     2 2017-10-01 05:41:59  1   63
3     3 2017-10-01 09:31:36  0   NA
4     4 2017-10-01 09:33:46  1  130
5     5 2017-10-01 11:29:04  0   NA
6     6 2017-10-01 12:28:28  1 3564

Entradas relacionadas

Referencias

2018-04-15

Recrear un objeto con la función dput en R

Problema

Deseamos recrear un objeto en R. Es decir, queremos el código que nos permite crear dicho objeto, en lugar de importarlo. En nuestro ejemplo un data frame cargado en nuestro directorio de trabajo, del que mostramos la parte inicial y final.

library(psych)
headTail(df)
    time group value
1      1     A     3
2      2     A     3
3      3     A     8
4      4     A     5
...  ...     ...
47     7     E     7
48     8     E     8
49     9     E    10
50    10     E     3

Solución

La función dput nos permite recrear dicho objeto.

dput(df)
 structure(list(time = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 
6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), group = c("A", "A", 
"A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", 
"B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "C", 
"C", "C", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D", "E", 
"E", "E", "E", "E", "E", "E", "E", "E", "E"), value = c(3L, 3L, 
8L, 5L, 4L, 4L, 9L, 6L, 7L, 4L, 5L, 2L, 6L, 8L, 6L, 7L, 6L, 2L, 
4L, 10L, 3L, 7L, 3L, 2L, 8L, 6L, 5L, 3L, 1L, 7L, 6L, 9L, 7L, 
4L, 6L, 4L, 7L, 6L, 7L, 7L, 3L, 4L, 10L, 2L, 7L, 10L, 7L, 8L, 
10L, 3L)), .Names = c("time", "group", "value"), row.names = c(NA, 
-50L), class = "data.frame")
Si quisiéramos crear de nuevo el objeto.

df <- structure(list(time = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 
6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), group = c("A", "A", 
"A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", 
"B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "C", 
"C", "C", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D", "E", 
"E", "E", "E", "E", "E", "E", "E", "E", "E"), value = c(3L, 3L, 
8L, 5L, 4L, 4L, 9L, 6L, 7L, 4L, 5L, 2L, 6L, 8L, 6L, 7L, 6L, 2L, 
4L, 10L, 3L, 7L, 3L, 2L, 8L, 6L, 5L, 3L, 1L, 7L, 6L, 9L, 7L, 
4L, 6L, 4L, 7L, 6L, 7L, 7L, 3L, 4L, 10L, 2L, 7L, 10L, 7L, 8L, 
10L, 3L)), .Names = c("time", "group", "value"), row.names = c(NA, 
-50L), class = "data.frame")
Si en lugar de recrear el código, quremos guardar el objeto en el directorio para acceder a él posteriormente:

# Guardarmos objeto en el directorio de trabajo
dput(df. "df")
# Volvemos a traerlo al directorio de trabajo
df_nuevo <- dget("df")

Referencias

2018-03-31

Mostrar las primeras y últimas n filas de un data frame en R

Problema

Deseamos mostrar simultáneamente las primeras n y últimas n filas de una matriz o data frame. Es decir, combinar las funciones head y tail.

Solución

La función headTail del paquete psych nos permite visualizar simultáneamente las n primeras filas (head) y las últimas n filas (tail).

  1. Opciones por defecto
  2. Por defecto headTail muestra las 4 primeras y últimas filas del objeto separadas por puntos.

    library(psych)
    headTail(ToothGrowth)
    
         len supp dose
    1    4.2   VC  0.5
    2   11.5   VC  0.5
    3    7.3   VC  0.5
    4    5.8   VC  0.5
    ...  ...   ...
    57  26.4   OJ    2
    58  27.3   OJ    2
    59  29.4   OJ    2
    60    23   OJ    2
    
  3. Más opciones
  4. La función headTail nos permite controlar el número de filas de la parte superior e inferior, la separación entre ambas, las columnas a mostrar y redondear el número dígitos. Veamos algunos ejemplos:

    #Primeras y últimas dos filas sin separación
    headTail(ToothGrowth, top = 2, bottom = 2, ellipsis = FALSE)
    
        len supp dose
    1   4.2   VC  0.5
    2  11.5   VC  0.5
    59 29.4   OJ  2.0
    60 23.0   OJ  2.0
    
    #Primeras y últimas tres filas, las columnas 4 y 5, con separación y sin decimales.
    headTail(iris, top = 3, bottom = 3, digits = 0 , from = 4, to = 5)
    
       Petal.Width   Species
    1             0    setosa
    2             0    setosa
    3             0    setosa
    ...         ...      
    148           2 virginica
    149           2 virginica
    150           2 virginica
    

Entradas relacionadas

Nube de datos