Recursos de interés

Preparativos

Paquetes y datos para ejemplos:

# Paquete para manejo de datos vectoriales
library(sf)

# Paquete de Tidyverse para manipulación de datos
library(dplyr)

# Paquete con conjuntos de datos geoespaciales
library(spData)

Adicionalmente, se utiliza el conjunto de datos de los cantones de Costa Rica publicado en la Infraestructura Nacional de Datos Espaciales de Costa Rica (SNIT), cuyas geometrías se simplifican con la funcion st_simplify(), para así facilitar su manipulación. Luego, se reproyectan con st_transform().

# Dirección base del servicio WFS
url_base_wfs <- "http://geos.snitcr.go.cr/be/IGN_5/wfs?"

# La lista de capas puede verse con el método GetCapabilities, en el siguiente URL:
# http://geos.snitcr.go.cr/be/IGN_5/wfs?request=GetCapabilities

# Solicitud de la capa WFS:
solicitud_wfs <- 
  "request=GetFeature&service=WFS&version=2.0.0&typeName=IGN_5:limitecantonal_5k&outputFormat=application/json"

# Recuperación de los datos en un data frame
sf_cantones_crtm05 <- st_read(paste0(url_base_wfs, solicitud_wfs))
## Reading layer `OGRGeoJSON' from data source `http://geos.snitcr.go.cr/be/IGN_5/wfs?request=GetFeature&service=WFS&version=2.0.0&typeName=IGN_5:limitecantonal_5k&outputFormat=application/json' using driver `GeoJSON'
## Simple feature collection with 82 features and 11 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: 156152 ymin: 608833.8 xmax: 658879.5 ymax: 1241118
## projected CRS:  CR05 / CRTM05
# Tamaño del conjunto de datos original
print(object.size(sf_cantones_crtm05), units="Mb")
## 19.9 Mb
# Simplificación de las geometrías
sf_cantones_crtm05_simp1 = st_simplify(sf_cantones_crtm05, dTolerance = 1000)

# Transformación al CRS WGS84
sf_cantones <- st_transform(sf_cantones_crtm05_simp1, 4326)

# Tamaño del conjunto de datos simplificado
print(object.size(sf_cantones), units="Mb")
## 0.1 Mb

El conjunto de datos de cantones queda almacenado en sf_cantones. Nótese la disminución del tamaño del conjunto de datos de geometrías simplificadas con respecto al original.

Introducción

Se les llama atributos a los elementos de datos no espaciales de un conjunto de datos geográficos. Los atributos generalmente son de tipo textual o numérico. Por ejemplo, en el conjunto de datos espaciales correspondiente a los países del mundo, los atributos son los campos correspondientes al nombre del país, la cantidad de habitantes, el producto interno bruto y otros.

Las operaciones con atributos incluyen la creación de subconjuntos (subsetting), la agregación (aggregation) y el cruce de datos (joining) .

Manejo de atributos en el paquete sf

El paquete sf define una clase, también llamada sf, la cual extiende la clase data.frame del paquete base de R. Los objetos de la clase sf tienen un registro (o feature) por cada observación y una columna por cada atributo. También tienen una columna especial para almacenar las geométrías (puntos, líneas, polígonos, etc.), la cual generalmente se denomina geometry o geom. Esto permite que sf utilice métodos (i.e. funciones) de la clase data.frame, tales como plot() y summary(), entre otros.

La lista de métodos de sf puede obtenerse a través de la función methods():

# Métodos de la clase sf
methods(class = "sf")
##  [1] $<-                   [                     [[<-                 
##  [4] aggregate             anti_join             arrange              
##  [7] as.data.frame         cbind                 coerce               
## [10] dbDataType            dbWriteTable          distinct             
## [13] dplyr_reconstruct     filter                full_join            
## [16] group_by              group_split           identify             
## [19] initialize            inner_join            left_join            
## [22] merge                 mutate                plot                 
## [25] print                 rbind                 rename               
## [28] right_join            sample_frac           sample_n             
## [31] select                semi_join             show                 
## [34] slice                 slotsFromS3           st_agr               
## [37] st_agr<-              st_area               st_as_s2             
## [40] st_as_sf              st_bbox               st_boundary          
## [43] st_buffer             st_cast               st_centroid          
## [46] st_collection_extract st_convex_hull        st_coordinates       
## [49] st_crop               st_crs                st_crs<-             
## [52] st_difference         st_filter             st_geometry          
## [55] st_geometry<-         st_interpolate_aw     st_intersection      
## [58] st_intersects         st_is                 st_is_valid          
## [61] st_join               st_line_merge         st_m_range           
## [64] st_make_valid         st_nearest_points     st_node              
## [67] st_normalize          st_point_on_surface   st_polygonize        
## [70] st_precision          st_reverse            st_sample            
## [73] st_segmentize         st_set_precision      st_shift_longitude   
## [76] st_simplify           st_snap               st_sym_difference    
## [79] st_transform          st_triangulate        st_union             
## [82] st_voronoi            st_wrap_dateline      st_write             
## [85] st_z_range            st_zm                 summarise            
## [88] transform             transmute             ungroup              
## see '?methods' for accessing help and source code

Además de data.frame, sf es compatible con clases como tbl y las del paquete tibble, las cuales pueden manipularse mediante los métodos de dplyr. Esto que permite un manejo tidy (ordenado, organizado) de los datos geoespaciales, de acuerdo con el enfoque de Tidyverse.

Funciones básicas para manejo de data frames y objetos sf

Funciones para obtener información básica de un data frame:

# Clase de sf_cantones
class(sf_cantones)
## [1] "sf"         "data.frame"
# Dimensiones (cantidad de filas y de columnas)
dim(sf_cantones)
## [1] 82 12
# Cantidad de filas
nrow(sf_cantones)
## [1] 82
# Cantidad de columnas
ncol(sf_cantones)
## [1] 12
# Nombres de las columnas
names(sf_cantones)
##  [1] "id"         "gmlid"      "objectid"   "cod_catalo" "cod_canton"
##  [6] "canton"     "ori_toponi" "area"       "cod_provin" "provincia" 
## [11] "version"    "geometry"

Remoción de la columna de geometría:

# Remoción de la columna de geometría
df_cantones <- st_drop_geometry(sf_cantones)

# Nombres de las columnas
names(df_cantones)
##  [1] "id"         "gmlid"      "objectid"   "cod_catalo" "cod_canton"
##  [6] "canton"     "ori_toponi" "area"       "cod_provin" "provincia" 
## [11] "version"
# Clase de world_df (nótese como no se muestra ya la clase sf)
class(df_cantones)
## [1] "data.frame"
# Tamaño del conjunto de datos original
print(object.size(sf_cantones), units="Kb")
## 133.9 Kb
# Tamaño del conjunto de datos sin geometrías
print(object.size(df_cantones), units="Kb")
## 42.9 Kb

La función st_drop_geometry() puede ser útil cuando, por ejemplo, solo se necesita trabajar con los atributos y la columna con la geometría consume demasiada memoria del computador.

También es posible ocultar la columna de geometría de un conjunto de datos, al momento de desplegarlo, mediante la opción drop=TRUE:

# Sin drop=TRUE
sf_cantones[1:10, c("canton", "area")]
## Simple feature collection with 10 features and 2 fields
## geometry type:  GEOMETRY
## dimension:      XY
## bbox:           xmin: -84.55536 ymin: 8.040251 xmax: -82.55287 ymax: 9.767523
## geographic CRS: WGS 84
##           canton    area                       geometry
## 1     Corredores  623.61 POLYGON ((-82.94161 8.42038...
## 2        Golfito 1753.42 MULTIPOLYGON (((-83.16666 8...
## 3      Coto Brus  944.24 POLYGON ((-82.90501 8.77424...
## 4            Osa 1932.03 POLYGON ((-83.83946 9.25534...
## 5   Buenos Aires 2382.94 POLYGON ((-83.32101 9.38409...
## 6  Pérez Zeledón 1901.08 POLYGON ((-83.77329 9.59824...
## 7         Quepos  557.85 POLYGON ((-84.13572 9.57168...
## 8      Talamanca 2792.23 POLYGON ((-82.89452 9.76752...
## 9        Parrita  483.22 POLYGON ((-84.30298 9.64968...
## 10       Tarrazú  291.27 POLYGON ((-83.98178 9.71801...
# Con drop=TRUE
sf_cantones[1:10, c("canton", "area"), drop=TRUE]
##           canton    area
## 1     Corredores  623.61
## 2        Golfito 1753.42
## 3      Coto Brus  944.24
## 4            Osa 1932.03
## 5   Buenos Aires 2382.94
## 6  Pérez Zeledón 1901.08
## 7         Quepos  557.85
## 8      Talamanca 2792.23
## 9        Parrita  483.22
## 10       Tarrazú  291.27

Creación de subconjuntos

Frecuentemente, es necesario extrer subconjuntos del conjunto de datos original, para facilidad de manejo y para atender requerimientos específicos de un análisis. En esta sección, se explican las diferentes opciones para creación de subconjuntos, tanto con el paquete base de R como con dplyr. En resumen, estas son:

  • Con el paquete base:
    • La notación de [] y $
    • La función subset()
  • Con el paquete dplyr:
    • La función select()
    • La función slice()
    • La función filter()

Notaciones y funciones del paquete base

La notación de [] y $

La notación de paréntesis cuadrados ([]) y el signo de dólar ($) permite crear subconjuntos con base en la posición de filas y de columnas, por medio de nombres de columnas y a través de la especificación de condiciones (i.e. expresiones booleanas).

# Subconjunto especificado por posiciones de filas
sf_cantones[1:10, ]
# Subconjunto especificado por posiciones de columnas
sf_cantones[, 8:10]
## Simple feature collection with 82 features and 3 fields
## geometry type:  GEOMETRY
## dimension:      XY
## bbox:           xmin: -87.09101 ymin: 5.500758 xmax: -82.55287 ymax: 11.21964
## geographic CRS: WGS 84
## First 10 features:
##       area cod_provin  provincia                       geometry
## 1   623.61          6 Puntarenas POLYGON ((-82.94161 8.42038...
## 2  1753.42          6 Puntarenas MULTIPOLYGON (((-83.16666 8...
## 3   944.24          6 Puntarenas POLYGON ((-82.90501 8.77424...
## 4  1932.03          6 Puntarenas POLYGON ((-83.83946 9.25534...
## 5  2382.94          6 Puntarenas POLYGON ((-83.32101 9.38409...
## 6  1901.08          1   San José POLYGON ((-83.77329 9.59824...
## 7   557.85          6 Puntarenas POLYGON ((-84.13572 9.57168...
## 8  2792.23          7      Limón POLYGON ((-82.89452 9.76752...
## 9   483.22          6 Puntarenas POLYGON ((-84.30298 9.64968...
## 10  291.27          1   San José POLYGON ((-83.98178 9.71801...
# Subconjunto especificado por nombres de columnas
sf_cantones[, c("canton", "area", "provincia")]
## Simple feature collection with 82 features and 3 fields
## geometry type:  GEOMETRY
## dimension:      XY
## bbox:           xmin: -87.09101 ymin: 5.500758 xmax: -82.55287 ymax: 11.21964
## geographic CRS: WGS 84
## First 10 features:
##           canton    area  provincia                       geometry
## 1     Corredores  623.61 Puntarenas POLYGON ((-82.94161 8.42038...
## 2        Golfito 1753.42 Puntarenas MULTIPOLYGON (((-83.16666 8...
## 3      Coto Brus  944.24 Puntarenas POLYGON ((-82.90501 8.77424...
## 4            Osa 1932.03 Puntarenas POLYGON ((-83.83946 9.25534...
## 5   Buenos Aires 2382.94 Puntarenas POLYGON ((-83.32101 9.38409...
## 6  Pérez Zeledón 1901.08   San José POLYGON ((-83.77329 9.59824...
## 7         Quepos  557.85 Puntarenas POLYGON ((-84.13572 9.57168...
## 8      Talamanca 2792.23      Limón POLYGON ((-82.89452 9.76752...
## 9        Parrita  483.22 Puntarenas POLYGON ((-84.30298 9.64968...
## 10       Tarrazú  291.27   San José POLYGON ((-83.98178 9.71801...

Especificación mediante una condición:

# Cantones de la provincia de Cartago
sf_cantones[sf_cantones$provincia == "Cartago", c("canton", "provincia"), drop = TRUE]
##       canton provincia
## 19 El Guarco   Cartago
## 20   Cartago   Cartago
## 22   Paraíso   Cartago
## 23   Jiménez   Cartago
## 24 Turrialba   Cartago
## 26  Oreamuno   Cartago
## 29  La Unión   Cartago
## 34  Alvarado   Cartago

La función subset()

La función subset() también retorna un subconjunto que cumple una condición:

# Cantones con área >= 2000 km2
subset(
  sf_cantones[, c("canton", "area"), drop=TRUE], 
  area >= 2000
)
##          canton    area
## 5  Buenos Aires 2382.94
## 8     Talamanca 2792.23
## 70       Pococí 2408.76
## 71   San Carlos 3352.31
## 74    Sarapiquí 2144.38

Los operadores lógicos y de comparación que pueden utilizarse en las condiciones de la función subset(), y en expresiones booleanas en general, se listan en la siguiente tabla:

Operador Descripción
== igual a
!= distinto de
>, < mayor que, menor que
>=, <= mayor o igual que, menor o igual que
&, |, ! Operadores lógicos: y, o, no

Funciones del paquete dplyr

Las funciones del paquete base de R son confiables y ampliamente usadas. Sin embargo, el enfoque más moderno de dplyr permite flujos de trabajo más intuitivos y es más rápido, debido a que se apoya en código escrito en el lenguaje C++. Esto es útil, por ejemplo, cuando se trabaja con conjuntos de datos grandes (big data) y cuando se necesita integración con bases de datos. Las principales funciones de dplyr para creación de subconjuntos son select(), slice() y filter().

La función select()

La función select() permite seleccionar y renombrar columnas de un conjunto de datos.

# Selección de columnas
select(
  sf_cantones, 
  canton, provincia
)
## Simple feature collection with 82 features and 2 fields
## geometry type:  GEOMETRY
## dimension:      XY
## bbox:           xmin: -87.09101 ymin: 5.500758 xmax: -82.55287 ymax: 11.21964
## geographic CRS: WGS 84
## First 10 features:
##           canton  provincia                       geometry
## 1     Corredores Puntarenas POLYGON ((-82.94161 8.42038...
## 2        Golfito Puntarenas MULTIPOLYGON (((-83.16666 8...
## 3      Coto Brus Puntarenas POLYGON ((-82.90501 8.77424...
## 4            Osa Puntarenas POLYGON ((-83.83946 9.25534...
## 5   Buenos Aires Puntarenas POLYGON ((-83.32101 9.38409...
## 6  Pérez Zeledón   San José POLYGON ((-83.77329 9.59824...
## 7         Quepos Puntarenas POLYGON ((-84.13572 9.57168...
## 8      Talamanca      Limón POLYGON ((-82.89452 9.76752...
## 9        Parrita Puntarenas POLYGON ((-84.30298 9.64968...
## 10       Tarrazú   San José POLYGON ((-83.98178 9.71801...
# Selección y renombramiento de la columna area
select(
  sf_cantones, 
  canton, area_km2=area, provincia
)
## Simple feature collection with 82 features and 3 fields
## geometry type:  GEOMETRY
## dimension:      XY
## bbox:           xmin: -87.09101 ymin: 5.500758 xmax: -82.55287 ymax: 11.21964
## geographic CRS: WGS 84
## First 10 features:
##           canton area_km2  provincia                       geometry
## 1     Corredores   623.61 Puntarenas POLYGON ((-82.94161 8.42038...
## 2        Golfito  1753.42 Puntarenas MULTIPOLYGON (((-83.16666 8...
## 3      Coto Brus   944.24 Puntarenas POLYGON ((-82.90501 8.77424...
## 4            Osa  1932.03 Puntarenas POLYGON ((-83.83946 9.25534...
## 5   Buenos Aires  2382.94 Puntarenas POLYGON ((-83.32101 9.38409...
## 6  Pérez Zeledón  1901.08   San José POLYGON ((-83.77329 9.59824...
## 7         Quepos   557.85 Puntarenas POLYGON ((-84.13572 9.57168...
## 8      Talamanca  2792.23      Limón POLYGON ((-82.89452 9.76752...
## 9        Parrita   483.22 Puntarenas POLYGON ((-84.30298 9.64968...
## 10       Tarrazú   291.27   San José POLYGON ((-83.98178 9.71801...

La función slice()

slice() es el equivalente de select() para filas.

# Subconjunto especificado mediante un rango de filas
slice(
  sf_cantones, 
  1:10
)

La función filter()

La función filter() es el equivalente en dplyr de la función subset() del paquete base. Retorna los registros que cumplen con una condición:

# Androides de "La Guerra de las Galaxias"
filter(
  starwars, 
  species=="Droid"
)
## # A tibble: 6 x 14
##   name  height  mass hair_color skin_color eye_color birth_year sex   gender
##   <chr>  <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
## 1 C-3PO    167    75 <NA>       gold       yellow           112 none  mascu~
## 2 R2-D2     96    32 <NA>       white, bl~ red               33 none  mascu~
## 3 R5-D4     97    32 <NA>       white, red red               NA none  mascu~
## 4 IG-88    200   140 none       metal      red               15 none  mascu~
## 5 R4-P~     96    NA none       silver, r~ red, blue         NA none  femin~
## 6 BB8       NA    NA none       none       black             NA none  mascu~
## # ... with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>

Las funciones del paquete dplyr suelen ser utilizadas conjuntamente con el operador pipe (%>%), el cual posibilita el “encadenamiento” de funciones: la salida de la función previa se convierte en el primer argumento de la siguiente función. En el siguiente ejemplo, el conjunto de datos starwars se pasa como entrada a la función filter(), para filtrar los personajes humanos. Seguidamente, el resultado se pasa a la función select(), para seleccionar las columnas name, homeworld y species. Finalmente, la función slice() reduce el resultado a las 10 primeras filas.

# Encadenamiento de funciones mediante pipe (%>%)
starwars %>%
  filter(species == "Human") %>%
  select(name, homeworld, species) %>%
  slice(1:10)
## # A tibble: 10 x 3
##    name               homeworld species
##    <chr>              <chr>     <chr>  
##  1 Luke Skywalker     Tatooine  Human  
##  2 Darth Vader        Tatooine  Human  
##  3 Leia Organa        Alderaan  Human  
##  4 Owen Lars          Tatooine  Human  
##  5 Beru Whitesun lars Tatooine  Human  
##  6 Biggs Darklighter  Tatooine  Human  
##  7 Obi-Wan Kenobi     Stewjon   Human  
##  8 Anakin Skywalker   Tatooine  Human  
##  9 Wilhuff Tarkin     Eriadu    Human  
## 10 Han Solo           Corellia  Human

Una alternativa al uso de pipes es el anidamiento de las funciones:

# Anidamiento de funciones
slice(
  select(
    filter(
      starwars,
      species=="Human"
    ),
    name, homeworld, species
  ),
  1:10
)
## # A tibble: 10 x 3
##    name               homeworld species
##    <chr>              <chr>     <chr>  
##  1 Luke Skywalker     Tatooine  Human  
##  2 Darth Vader        Tatooine  Human  
##  3 Leia Organa        Alderaan  Human  
##  4 Owen Lars          Tatooine  Human  
##  5 Beru Whitesun lars Tatooine  Human  
##  6 Biggs Darklighter  Tatooine  Human  
##  7 Obi-Wan Kenobi     Stewjon   Human  
##  8 Anakin Skywalker   Tatooine  Human  
##  9 Wilhuff Tarkin     Eriadu    Human  
## 10 Han Solo           Corellia  Human

Agregación

Las operaciones de agregación realizan cálculos (suma, promedio, etc.) a partir de la agrupación de valores de variables. En esta sección, se explican funciones de agregación contenidas en los paquetes stats, sf y dplyr, las cuales son:

  • Del paquete stats:
    • La función aggregate()
  • Del paquete sf:
    • La función aggregate()
  • Del paquete dplyr:
    • La función summarize()

Para los ejemplos, se utilizarán nuevamente datos publicados en la Infraestructura Nacional de Datos Espaciales de Costa Rica (SNIT):

# Recuperación de los conjuntos de datos de provincias y cantones de Costa Rica desde un servicio WFS

# URL base
url_base_wfs <- "http://geos.snitcr.go.cr/be/IGN_5/wfs?"

# URL de las solicitudes de las capas
solicitud_provincias_wfs <- "request=GetFeature&service=WFS&version=2.0.0&typeName=IGN_5:limiteprovincial_5k&outputFormat=application/json"
solicitud_cantones_wfs <- "request=GetFeature&service=WFS&version=2.0.0&typeName=IGN_5:limitecantonal_5k&outputFormat=application/json"

# Recuperación, simplificación y cambio de CRS de las capas
st_read(paste0(url_base_wfs, solicitud_provincias_wfs)) %>%
  st_simplify(dTolerance = 1000) %>% 
  st_transform(4326) -> cr_provincias

st_read(paste0(url_base_wfs, solicitud_cantones_wfs)) %>% 
  st_simplify(dTolerance = 1000) %>% 
  st_transform(4326) -> sf_cantones
# Mapeo de la capa de provincias
plot(cr_provincias$geometry, axes=TRUE, graticule=TRUE)

# Mapeo de la capa de cantones
plot(sf_cantones$geometry, axes=TRUE, graticule=TRUE)

La función aggregate() de stats

La función aggregate() del paquete stats aplica una función de agregación (ej. suma, promedio, mínimo, máximo) sobre una columna. El resultado es un objeto de tipo data.frame.

# Suma de áreas de cantones por provincia
aggregate(
  data = sf_cantones, 
  area ~ provincia, 
  FUN = sum, 
  na.rm = TRUE
)
##    provincia     area
## 1   Alajuela  9772.25
## 2    Cartago  3093.23
## 3 Guanacaste 10189.85
## 4    Heredia  2663.45
## 5      Limón  9176.97
## 6 Puntarenas 11298.51
## 7   San José  4969.73

La función aggregate() de sf

aggregate() es una función genérica, lo que significa que pueden comportarse de manera diferente, dependiendo de los valores de entrada. El paquete sf también provee una versión de aggregate(), la cual se activa cuando recibe un objeto sf y se usa el argumento by. El resultado es un objeto de tipo sf.

# Suma de áreas de cantones por provincia
aggregate(
  sf_cantones["area"], 
  by = list(sf_cantones$provincia), 
  FUN = sum, 
  na.rm = TRUE
)
## Simple feature collection with 7 features and 2 fields
## Attribute-geometry relationship: 0 constant, 1 aggregate, 1 identity
## geometry type:  GEOMETRY
## dimension:      XY
## bbox:           xmin: -87.09101 ymin: 5.500758 xmax: -82.55287 ymax: 11.21964
## geographic CRS: WGS 84
##      Group.1     area                       geometry
## 1   Alajuela  9772.25 POLYGON ((-84.46768 9.94154...
## 2    Cartago  3093.23 POLYGON ((-83.81564 10.0834...
## 3 Guanacaste 10189.85 POLYGON ((-85.19084 10.0639...
## 4    Heredia  2663.45 MULTIPOLYGON (((-84.17558 1...
## 5      Limón  9176.97 POLYGON ((-82.89299 9.76667...
## 6 Puntarenas 11298.51 MULTIPOLYGON (((-87.04808 5...
## 7   San José  4969.73 POLYGON ((-83.76921 9.59051...

La función summarize()

La función summarize() es el equivalente de aggregate() en el paquete dplyr. Suele utilizarse conjuntamente con group_by(), que especifica la variable a agrupar.

# Suma de áreas de cantones por provincia
sf_cantones %>%
group_by(provincia) %>%
summarize(area_km2 = sum(area, na.rm = TRUE))
## `summarise()` ungrouping output (override with `.groups` argument)
## Simple feature collection with 7 features and 2 fields
## geometry type:  GEOMETRY
## dimension:      XY
## bbox:           xmin: -87.09101 ymin: 5.500758 xmax: -82.55287 ymax: 11.21964
## geographic CRS: WGS 84
## # A tibble: 7 x 3
##   provincia  area_km2                                                   geometry
##   <chr>         <dbl>                                             <GEOMETRY [°]>
## 1 Alajuela      9772. POLYGON ((-84.46768 9.941544, -84.46238 9.924008, -84.542~
## 2 Cartago       3093. POLYGON ((-83.81564 10.08343, -83.66829 10.02485, -83.605~
## 3 Guanacaste   10190. POLYGON ((-85.19084 10.06393, -85.18589 10.0664, -85.1498~
## 4 Heredia       2663. MULTIPOLYGON (((-84.17558 10.00458, -84.15569 9.968855, -~
## 5 Limón         9177. POLYGON ((-82.89299 9.766678, -82.83611 9.73543, -82.8093~
## 6 Puntarenas   11299. MULTIPOLYGON (((-87.04808 5.556849, -87.0301 5.527324, -8~
## 7 San José      4970. POLYGON ((-83.76921 9.590515, -83.75314 9.560028, -83.718~

Nótese que este enfoque permite renombrar las variables, como también se hace en el siguiente ejemplo:

# Suma total de las áreas de cantones
sf_cantones %>% 
summarize(area_km2 = sum(area, na.rm = TRUE), cantidad_cantones = n())
## Simple feature collection with 1 feature and 2 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: -87.09101 ymin: 5.500758 xmax: -82.55287 ymax: 11.21964
## geographic CRS: WGS 84
##   area_km2 cantidad_cantones                       geometry
## 1 51163.99                82 MULTIPOLYGON (((-87.04808 5...

El siguiente ejemplo utiliza otras funciones del paquete dplyr para encontrar las tres provincias más grandes y su respectiva área:

# Área y cantidad de cantones de las tres provincias más grandes
sf_cantones %>% 
  select(area, provincia) %>% 
  group_by(provincia) %>% 
  summarize(area = sum(area, na.rm = TRUE), cantidad_cantones = n()) %>% 
  arrange(desc(area)) %>%
  top_n(n = 3, wt = area) %>%
  st_drop_geometry()
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 3 x 3
##   provincia    area cantidad_cantones
## * <chr>       <dbl>             <int>
## 1 Puntarenas 11299.                11
## 2 Guanacaste 10190.                11
## 3 Alajuela    9772.                16

Cruce de datos

La combinación de datos ubicados en diferentes fuentes es una tarea común en análisis. Este tipo de operaciones se realizan con base en atributos que son comunes en los conjuntos de datos que se desea cruzar. El paquete dplyr proporciona varias funciones para realizar cruces de datos, entre las que se encuentran:

  • La función left_join()
  • La función inner_join()

La función left_join()

La función left_join() mantiene todos los registros de la tabla del lado izquierdo y agrega las columnas de la tabla del lado derecho, en los registros en los que hay coincidencia.

# "Join" de los datos de producción de café. Ambas tablas comparten la columna name_long.
world_coffee_1 <- left_join(world, coffee_data)
## Joining, by = "name_long"
# Mapeo de la producción de café en 2017
plot(world_coffee_1["coffee_production_2017"], main="Producción mundial de café en 2017")

La función inner_join()

La función inner_join() retorna solamente aquellos registros que coinciden en ambas tablas.

# "Join" de los datos de producción de café. Ambas tablas comparten la columna name_long.
world_coffee_2 <- inner_join(world, coffee_data)
## Joining, by = "name_long"
# Mapeo de la producción de café en 2017
plot(world_coffee_2["coffee_production_2017"], main="Producción mundial de café en 2017")

Ejercicios

  1. Mediante pipes, encadene un conjunto de funciones del paquete dplyr para desplegar el nombre, el área y la provincia de los cantones cuya área sea menor a 50 km2 y que se ubiquen en las provincias de Heredia o de Cartago.
  2. Repita el ejercicio anterior, utilizando funciones anidadas.