Operaciones de datos de atributos

Este documento está estructurado con base en el capítulo 3 de Lovelace, R., Nowosad, J. & Muenchow, J. (2020). Geocomputation with R.

Trabajo previo

Lea el capítulo 3 de Lovelace, R., Nowosad, J. & Muenchow, J. (2020). Geocomputation with R.

Preparativos

Carga de paquetes

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

# Paquete para manejo de datos vectoriales
library(sf)

# Paquete para manejo de datos raster
library(terra)

Conjuntos de datos

Provincias de Costa Rica (Instituto Geográfico Nacional)
# Carga de datos
provincias <-
  st_read(
    "https://raw.githubusercontent.com/tpb728O-programaciongeoespacialr/2021ii/main/datos/ign/delimitacion-territorial-administrativa/provincias.geojson",
    quiet = TRUE
  )

# Mapeo
plot(provincias$geometry)

Cantones de Costa Rica (Instituto Geográfico Nacional)
# Carga de datos
cantones <-
  st_read(
    "https://raw.githubusercontent.com/tpb728O-programaciongeoespacialr/2021ii/main/datos/ign/delimitacion-territorial-administrativa/cantones.geojson",
    quiet = TRUE
  )

# Mapeo
plot(cantones$geometry)

spData: Datasets for Spatial Analysis (Bivand et al.)
Este paquete contiene conjuntos de datos de ejemplo para el libro Geocomputation with R. Su documentación está en Datasets for Spatial Analysis - spData.

# Carga del paquete
library(spData)

Introducción

Se les llama atributos a los elementos de datos no espaciales o geométricos de un conjunto de datos geográficos. Estos datos pueden ser de tipos numéricos o textuales, entre otros. Un conjunto de datos vectoriales puede tener asociados varios campos de atributos, mientras que un conjunto de datos raster tiene solamente uno.

Datos vectoriales

Las operaciones con atributos en datos vectoriales incluyen:

Seguidamente, se explicará como maneja estas operaciones el paquete sf.

Manejo de datos de atributos con el paquete sf

Como se mencionó, el paquete sf define una clase, llamada sf, la cual extiende la clase data.frame del paquete base de R. Los objetos de la clase sf tienen una fila (o feature) por cada observación y una columna por cada atributo. También tienen una columna especial para almacenar las geometrí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.

Además de data.frame, sf es compatible con clases como 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.

En la secciones siguientes, se explicará el manejo de datos de atributos tanto mediante funciones y operaciones del paquete base de R, como mediante Tidyverse.

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

Las siguientes son algunas de las funciones disponibles para obtener información básica de un objeto sf.

# Clase de cantones
class(cantones)
[1] "sf"         "data.frame"
# Dimensiones (cantidad de filas y de columnas)
dim(cantones)
[1] 82 11
# Cantidad de filas (i.e. observaciones)
nrow(cantones)
[1] 82
# Cantidad de columnas (i.e. variables)
ncol(cantones)
[1] 11
# Nombres de las columnas
names(cantones)
 [1] "gml_id"     "gmlid"      "cod_catalo" "cod_canton" "canton"    
 [6] "ori_toponi" "area"       "cod_provin" "provincia"  "version"   
[11] "geometry"  

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 demasiados recursos del computador.

# Remoción de la columna de geometría
cantones_df <- st_drop_geometry(cantones)

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

Para algunas operaciones, también es posible ocultar la columna de geometría de un conjunto de datos (sin borrarla) mediante el argumento drop = TRUE.

# Sin drop = TRUE
cantones[1:10, c("canton", "area")]
Simple feature collection with 10 features and 2 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 439032.1 ymin: 889175.6 xmax: 658879.5 ymax: 1080261
Projected CRS: CR05 / CRTM05
          canton    area                       geometry
1     Corredores  623.61 MULTIPOLYGON (((616552.4 93...
2        Golfito 1753.42 MULTIPOLYGON (((558675.7 96...
3      Coto Brus  944.24 MULTIPOLYGON (((620471.4 97...
4            Osa 1932.03 MULTIPOLYGON (((517638.5 10...
5   Buenos Aires 2382.94 MULTIPOLYGON (((574574.2 10...
6  Pérez Zeledón 1901.08 MULTIPOLYGON (((524884 1061...
7         Quepos  557.85 MULTIPOLYGON (((485102 1058...
8      Talamanca 2792.23 MULTIPOLYGON (((621284.1 10...
9        Parrita  483.22 MULTIPOLYGON (((466749.5 10...
10       Tarrazú  291.27 MULTIPOLYGON (((501998.9 10...
# Con drop = TRUE
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:

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 lógicas).

# Subconjunto especificado por posiciones de filas
cantones[1:10, ]

# Subconjunto especificado por posiciones de columnas
cantones[, 8:10]

# Subconjunto especificado por nombres de columnas
cantones[, c("canton", "area", "provincia")]

Especificación mediante una condición (i.e. expresión lógica):

# Cantones de la provincia de Cartago
cantones[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 cuyos registros cumplen una condición.

# Cantones con área >= 2000 km2
subset(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.33
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 lógicas 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
cantones %>%
  select(canton, provincia)
Simple feature collection with 82 features and 2 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 156152 ymin: 608833.8 xmax: 658879.5 ymax: 1241118
Projected CRS: CR05 / CRTM05
First 10 features:
          canton  provincia                       geometry
1     Corredores Puntarenas MULTIPOLYGON (((616552.4 93...
2        Golfito Puntarenas MULTIPOLYGON (((558675.7 96...
3      Coto Brus Puntarenas MULTIPOLYGON (((620471.4 97...
4            Osa Puntarenas MULTIPOLYGON (((517638.5 10...
5   Buenos Aires Puntarenas MULTIPOLYGON (((574574.2 10...
6  Pérez Zeledón   San José MULTIPOLYGON (((524884 1061...
7         Quepos Puntarenas MULTIPOLYGON (((485102 1058...
8      Talamanca      Limón MULTIPOLYGON (((621284.1 10...
9        Parrita Puntarenas MULTIPOLYGON (((466749.5 10...
10       Tarrazú   San José MULTIPOLYGON (((501998.9 10...
# Selección y cambio de nombre de columnas
cantones %>%
  select(canton, area_km2 = area, provincia)
Simple feature collection with 82 features and 3 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 156152 ymin: 608833.8 xmax: 658879.5 ymax: 1241118
Projected CRS: CR05 / CRTM05
First 10 features:
          canton area_km2  provincia                       geometry
1     Corredores   623.61 Puntarenas MULTIPOLYGON (((616552.4 93...
2        Golfito  1753.42 Puntarenas MULTIPOLYGON (((558675.7 96...
3      Coto Brus   944.24 Puntarenas MULTIPOLYGON (((620471.4 97...
4            Osa  1932.03 Puntarenas MULTIPOLYGON (((517638.5 10...
5   Buenos Aires  2382.94 Puntarenas MULTIPOLYGON (((574574.2 10...
6  Pérez Zeledón  1901.08   San José MULTIPOLYGON (((524884 1061...
7         Quepos   557.85 Puntarenas MULTIPOLYGON (((485102 1058...
8      Talamanca  2792.23      Limón MULTIPOLYGON (((621284.1 10...
9        Parrita   483.22 Puntarenas MULTIPOLYGON (((466749.5 10...
10       Tarrazú   291.27   San José MULTIPOLYGON (((501998.9 10...
La función slice()

slice() es el equivalente de select() para filas. Crea un subconjunto con base en las posiciones de las filas.

# Subconjunto especificado mediante un rango de filas
cantones %>%
  slice(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"
starwars %>%
  filter(species == "Droid")
# A tibble: 6 × 14
  name   height  mass hair_color skin_color eye_color birth_year sex  
  <chr>   <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr>
1 C-3PO     167    75 <NA>       gold       yellow           112 none 
2 R2-D2      96    32 <NA>       white, bl… red               33 none 
3 R5-D4      97    32 <NA>       white, red red               NA none 
4 IG-88     200   140 none       metal      red               15 none 
5 R4-P17     96    NA none       silver, r… red, blue         NA none 
6 BB8        NA    NA none       none       black             NA none 
# … with 6 more variables: gender <chr>, 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” (chaining) 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 pipes (%>%)
starwars %>%
  filter(species == "Human") %>%
  select(name, homeworld, species) %>%
  slice(1:10)
# A tibble: 10 × 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” (nesting) de las funciones:

# Anidamiento de funciones
slice(
  select(
    filter(
      starwars,
      species=="Human"
    ),
    name, homeworld, species
  ),
  1:10
)
# A tibble: 10 × 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  

Ejercicio: mediante las funciones select() y filter() de dplyr, cree un nuevo objeto sf que contenga los cantones de Puntarenas y Guanacaste con área mayor o igual a 2000 km2. Incluya las columnas de provincia, cantón y área.

Agregación de datos

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:

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 = cantones, 
  area ~ provincia, 
  FUN = sum, 
  na.rm = TRUE
)
   provincia     area
1   Alajuela  9772.26
2    Cartago  3093.23
3 Guanacaste 10196.30
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(
  cantones["area"], 
  by = list(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
Bounding box:  xmin: 156152 ymin: 608833.8 xmax: 658879.5 ymax: 1241118
Projected CRS: CR05 / CRTM05
     Group.1     area                       geometry
1   Alajuela  9772.26 POLYGON ((459624 1098009, 4...
2    Cartago  3093.23 POLYGON ((524765.7 1112776,...
3 Guanacaste 10196.30 MULTIPOLYGON (((369535 1113...
4    Heredia  2663.45 POLYGON ((480807.3 1106290,...
5      Limón  9176.97 POLYGON ((623921.9 1079716,...
6 Puntarenas 11298.51 MULTIPOLYGON (((159835.5 60...
7   San José  4969.73 POLYGON ((526109.4 1059469,...

La función summarize() de dplyr

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
cantones %>%
  group_by(provincia) %>%
  summarize(area_km2 = sum(area, na.rm = TRUE))
Simple feature collection with 7 features and 2 fields
Geometry type: GEOMETRY
Dimension:     XY
Bounding box:  xmin: 156152 ymin: 608833.8 xmax: 658879.5 ymax: 1241118
Projected CRS: CR05 / CRTM05
# A tibble: 7 × 3
  provincia  area_km2                                         geometry
  <chr>         <dbl>                                   <GEOMETRY [m]>
1 Alajuela      9772. POLYGON ((459624 1098009, 459559.2 1097982, 459…
2 Cartago       3093. POLYGON ((524765.7 1112776, 530118.9 1110214, 5…
3 Guanacaste   10196. MULTIPOLYGON (((369535 1113024, 369537.7 111302…
4 Heredia       2663. POLYGON ((480807.3 1106290, 480819.4 1106299, 4…
5 Limón         9177. POLYGON ((623921.9 1079716, 623929.5 1079700, 6…
6 Puntarenas   11299. MULTIPOLYGON (((159835.5 609410.8, 159829.1 609…
7 San José      4970. POLYGON ((526109.4 1059469, 526127.6 1059409, 5…

summarize() permite renombrar las variables, como se muestra seguidamente.

# Suma total de las áreas de cantones
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
Bounding box:  xmin: 156152 ymin: 608833.8 xmax: 658879.5 ymax: 1241118
Projected CRS: CR05 / CRTM05
  area_km2 cantidad_cantones                       geometry
1 51170.45                82 MULTIPOLYGON (((159829.1 60...

El siguiente ejemplo utiliza otras funciones del paquete dplyr para encontrar las tres provincias más grandes y sus respectivas áreas, con base en los datos disponibles en la capa de cantones.

# Área y cantidad de cantones de las tres provincias más grandes
cantones %>%
  st_drop_geometry() %>%  
  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)
# A tibble: 3 × 3
  provincia    area cantidad_cantones
  <chr>       <dbl>             <int>
1 Puntarenas 11299.                11
2 Guanacaste 10196.                11
3 Alajuela    9772.                16

Ejercicio: mediante summarize(), y otras funciones de dplyr, despliegue el área y la cantidad de cantones de las dos provincias más pequeñas.

Cruce de datos

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

Seguidamente, se ejemplificarán las dos primeras.

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.
productores_cafe_1 <- left_join(world, coffee_data)

# Mapeo de la producción de café en 2017
plot(productores_cafe_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.
productores_cafe_2 <- inner_join(world, coffee_data)

# Mapeo de la producción de café en 2017
plot(productores_cafe_2["coffee_production_2017"], main = "Producción mundial de café en 2017")

Datos raster

Las operaciones con atributos en datos raster incluyen:

Seguidamente, se explicará como maneja estas operaciones el paquete terra.

Manejo de datos de atributos con el paquete terra

Funciones básicas para manejo de objetos SpatRaster

El siguiente bloque de código crea y mapea un objeto SpatRaster llamado elevacion.

# Creación de objeto SpatRaster
elevacion <- rast(
  nrows = 6,
  ncols = 6,
  resolution = 0.5,
  xmin = -1.5,
  xmax = 1.5,
  ymin = -1.5,
  ymax = 1.5,
  vals = 1:36
)

# Mapeo
plot(elevacion)

Los objetos SpatRaster también pueden contener valores categóricos de tipo logical o factor. El siguiente bloque de código crea y mapea un objeto SpatRaster con información sobre tipos de granos de una porción de suelo.

# Tipos de granos
grano_tipo <- c("arcilla", "limo", "arena")

# Lista de granos generada aleatoriamente
lista_granos <- sample(grano_tipo, 36, replace = TRUE)
lista_granos
 [1] "arena"   "arena"   "arcilla" "limo"    "arena"   "arcilla"
 [7] "arcilla" "arcilla" "arena"   "limo"    "limo"    "limo"   
[13] "arena"   "arcilla" "arcilla" "arena"   "arena"   "arcilla"
[19] "arcilla" "limo"    "arena"   "arcilla" "arena"   "limo"   
[25] "arcilla" "arcilla" "limo"    "arcilla" "arcilla" "limo"   
[31] "arena"   "arena"   "limo"    "arena"   "limo"    "arcilla"
# Factor de tipos de granos
grano_factor <- factor(lista_granos, levels = grano_tipo)

# Objeto SpatRaster de tipos de granos
grano <- rast(
  nrows = 6,
  ncols = 6,
  resolution = 0.5,
  xmin = -1.5,
  xmax = 1.5,
  ymin = -1.5,
  ymax = 1.5,
  vals = grano_factor
)

# Mapeo
plot(grano)

Ambos objetos pueden guardados en el disco con la función writeRaster().

# Especificación del directorio de trabajo (debe ser una ruta existente)
setwd("/home/mfvargas")

# Escritura de los objetos raster
writeRaster(elevacion, "elevacion.asc")
writeRaster(grano, "grano.asc")

La función levels() puede utilizarse para consultar la Raster Attribute Table (RAT) de un objeto SpatRaster, la cual contiene información sobre sus factores y niveles. También puede emplearse para asignar nuevos factores a un objeto.

# Consulta de la RAT
levels(grano)
[[1]]
[1] "arcilla" "limo"    "arena"  
# Nuevo factor
levels(grano)[[1]] = c(levels(grano)[[1]], humedad = c("mojado", "húmedo", "seco"))

# Consulta de la RAT
levels(grano)
[[1]]
[1] "arcilla" "limo"    "arena"   "mojado"  "húmedo"  "seco"   

Creación de subconjuntos

Los subconjuntos se crean en objetos SpatRaster con el operador [, el cual acepta una variedad de entradas.

En esta lección, solo se tratarán las dos primeras opciones. Las restantes se cubrirán en las secciones sobre operaciones espaciales.

Las dos primeras opciones se ilustran en el siguiente bloque de código, en el que se consulta la celda (también llamada pixel) ubicada en la esquina superior izquierda del objeto de elevación.

# Celda en la fila 1, columna 1
elevacion[1, 1]
  lyr.1
1     1
# Celda con ID = 1
elevacion[1]
  lyr.1
1     1

La totalidad de los valores del objeto SpatRaster puede consultarse con las función values().

# Valores de un objeto raster
values(elevacion)
      lyr.1
 [1,]     1
 [2,]     2
 [3,]     3
 [4,]     4
 [5,]     5
 [6,]     6
 [7,]     7
 [8,]     8
 [9,]     9
[10,]    10
[11,]    11
[12,]    12
[13,]    13
[14,]    14
[15,]    15
[16,]    16
[17,]    17
[18,]    18
[19,]    19
[20,]    20
[21,]    21
[22,]    22
[23,]    23
[24,]    24
[25,]    25
[26,]    26
[27,]    27
[28,]    28
[29,]    29
[30,]    30
[31,]    31
[32,]    32
[33,]    33
[34,]    34
[35,]    35
[36,]    36

Estas funciones también pueden utilizarse en objetos de múltiples capas.

# Creación de un objeto SpatRaster de dos capas
multiples_capas = c(elevacion, grano)
multiples_capas
class       : SpatRaster 
dimensions  : 6, 6, 2  (nrow, ncol, nlyr)
resolution  : 0.5, 0.5  (x, y)
extent      : -1.5, 1.5, -1.5, 1.5  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs 
sources     : memory  
              memory  
names       : lyr.1,   lyr.1 
min values  :     1, arcilla 
max values  :    36,    seco 
# Modificación de valores de celdas
multiples_capas[1] = cbind(c(0), c(4))

# Consulta de todos los valores
multiples_capas[]
      lyr.1 lyr.1
 [1,]     0     4
 [2,]     2     2
 [3,]     3     0
 [4,]     4     1
 [5,]     5     2
 [6,]     6     0
 [7,]     7     0
 [8,]     8     0
 [9,]     9     2
[10,]    10     1
[11,]    11     1
[12,]    12     1
[13,]    13     2
[14,]    14     0
[15,]    15     0
[16,]    16     2
[17,]    17     2
[18,]    18     0
[19,]    19     0
[20,]    20     1
[21,]    21     2
[22,]    22     0
[23,]    23     2
[24,]    24     1
[25,]    25     0
[26,]    26     0
[27,]    27     1
[28,]    28     0
[29,]    29     0
[30,]    30     1
[31,]    31     2
[32,]    32     2
[33,]    33     1
[34,]    34     2
[35,]    35     1
[36,]    36     0

Como se mostró en el ejemplo anterior, el operador [ también puede utilizarse para modificar los valores de las celdas un objeto SpatRaster.

# Modificación de una celda
elevacion[1, 1] = 0

# Consulta de todos los valores del raster (equivalente a values())
elevacion[]
      lyr.1
 [1,]     0
 [2,]     2
 [3,]     3
 [4,]     4
 [5,]     5
 [6,]     6
 [7,]     7
 [8,]     8
 [9,]     9
[10,]    10
[11,]    11
[12,]    12
[13,]    13
[14,]    14
[15,]    15
[16,]    16
[17,]    17
[18,]    18
[19,]    19
[20,]    20
[21,]    21
[22,]    22
[23,]    23
[24,]    24
[25,]    25
[26,]    26
[27,]    27
[28,]    28
[29,]    29
[30,]    30
[31,]    31
[32,]    32
[33,]    33
[34,]    34
[35,]    35
[36,]    36
# Modificación de rangos de celdas
elevacion[1, c(1, 2)] = 0

elevacion[1, 1:6] = 0
elevacion[2, 1:6] = 10
elevacion[3, 1:6] = 15
elevacion[4, 1:6] = 15
elevacion[5, 1:6] = 20
elevacion[6, 1:6] = 35

# Consulta de los valores
elevacion[]
      lyr.1
 [1,]     0
 [2,]     0
 [3,]     0
 [4,]     0
 [5,]     0
 [6,]     0
 [7,]    10
 [8,]    10
 [9,]    10
[10,]    10
[11,]    10
[12,]    10
[13,]    15
[14,]    15
[15,]    15
[16,]    15
[17,]    15
[18,]    15
[19,]    15
[20,]    15
[21,]    15
[22,]    15
[23,]    15
[24,]    15
[25,]    20
[26,]    20
[27,]    20
[28,]    20
[29,]    20
[30,]    20
[31,]    35
[32,]    35
[33,]    35
[34,]    35
[35,]    35
[36,]    35

Resumen de información

La escritura del nombre de un objeto SpatRaster en la consola imprime información general sobre ese objeto. La función summary() proporciona algunas estadísticas descriptivas (mínimo, máximo, cuartiles, etc.). Otras estadísticas pueden ser calculadas con global().

# Información general
elevacion
class       : SpatRaster 
dimensions  : 6, 6, 1  (nrow, ncol, nlyr)
resolution  : 0.5, 0.5  (x, y)
extent      : -1.5, 1.5, -1.5, 1.5  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs 
source      : memory 
name        : lyr.1 
min value   :     0 
max value   :    35 
# Resumen de un raster de una capa
summary(elevacion)
     lyr.1      
 Min.   : 0.00  
 1st Qu.:10.00  
 Median :15.00  
 Mean   :15.83  
 3rd Qu.:20.00  
 Max.   :35.00  
# Resumen de varias capas
summary(c(elevacion, grano))
     lyr.1           lyr.1       
 Min.   : 0.00   Min.   :0.0000  
 1st Qu.:10.00   1st Qu.:0.0000  
 Median :15.00   Median :1.0000  
 Mean   :15.83   Mean   :0.9444  
 3rd Qu.:20.00   3rd Qu.:2.0000  
 Max.   :35.00   Max.   :2.0000  
# Desviación estándar
global(elevacion, sd)
            sd
lyr.1 10.72381

Adicionalmente, la función freq() retorna la tabla de frecuencias de valores categóricos.

# Tabla de frecuencias
freq(grano)
  layer value count   label
1     1     0    14 arcilla
2     1     1    10    limo
3     1     2    12   arena

Las estadísticas pueden ser visualizadas con funciones como hist() y density().

# Histograma
hist(elevacion)
# Densidad
density(elevacion)

Corrections

If you see mistakes or want to suggest changes, please create an issue on the source repository.

Reuse

Text and figures are licensed under Creative Commons Attribution CC BY-SA 4.0. Source code is available at https://github.com/tpb728O-programaciongeoespacialr/2021ii/, unless otherwise noted. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".