Ejercicio de bases de datos

Author
Affiliation

María Suárez Muñoz

Departamento de Ingeniería Forestal, Universidad de Córdoba

Published

February 3, 2025

Introducción

  • En este ejercicio aprenderemos a trabajar con bases de datos desde R.

  • Vamos a trabajar con R, Rstudio (ahora llamado posit), y utilizaremos al menos los paquete RSQLite y dplyr.

  • El material utilizado en este manual puede descargarse aquí y este mismo ejercicio en formato .qmd puede descargarse desde aquí.

Flujo de Trabajo

  1. Instalar y cargar paquetes
  2. Crear conexión con base de datos
  3. Montar base de datos
  4. Realizar consultas
  5. Cerrar base de datos

Instalar y cargar paquetes

# install.packages("RSQLite")
library(RSQLite)
# install.packages("dplyr")
library(dplyr)

Crear conexión con base de datos

con = dbConnect(RSQLite::SQLite(), dbname = "material/sql.sqlite")
dbListTables(con)

Montar base de datos

parcelas <- read.table("material/ifn3p18_Convertida_Tabla_PCParcelas.txt", sep = ";", header = TRUE)
mayores <- read.table("material/ifn3p18_Convertida_Tabla_PCMayores.txt", sep = ";", header = TRUE)
matorral <- read.table("material/ifn3p18_Convertida_Tabla_PCMatorral.txt", sep = ";", header = TRUE)
regenera <- read.table("material/ifn3p18_Convertida_Tabla_PCRegenera.txt", sep = ";", header = TRUE)
arboles <- read.table("material/especies_ANEXO12.txt", sep = ";", header = TRUE)
arbustos <- read.table("material/especies_ANEXO13.txt", sep = ";", header = TRUE)

dbWriteTable(con, "parcelas", parcelas)
dbWriteTable(con, "mayores", mayores)
dbWriteTable(con, "matorral", matorral)
dbWriteTable(con, "regenera", regenera)
dbWriteTable(con, "arboles", arboles)
dbWriteTable(con, "arbustos", arbustos)

dbListTables(con)
dbListFields(con, "parcelas")
dbReadTable(con, "parcelas")

Realizar consultas

Una vez creada la base de datos podemos realizar consultas sobre ella aplicando el lenguaje SQL.

Por ejemplo, quiero conocer cuáles qué especies de árboles se han observado por parcela.

query <- dbSendQuery(con, 
  "SELECT DISTINCT Estadillo, Especie
  FROM mayores")
coexistentes <- dbFetch(query)
dbClearResult(query)

O quiero extraer el diámetro medio de todas las encinas muestreadas y el estadillo al que pertenecen.

query <- dbSendQuery(con, 
  "SELECT Estadillo, Especie, (Dn1 + Dn2/2) AS Dn_avg
  FROM mayores
  WHERE Especie = 45")
diam_encinas <- dbFetch(query)
dbClearResult(query)

Y también puedo realizar consultas más complejas. Por ejemplo, quiero conocer cuáles son las especies acompañantes a las encinas adultas en cada parcela.

query <- dbSendQuery(con, 
    "SELECT DISTINCT matorral.Especie, arbustos.Nombre
    FROM matorral
      INNER JOIN mayores ON matorral.Estadillo=mayores.Estadillo
      INNER JOIN arboles ON mayores.Especie = arboles.Codigo
      INNER JOIN arbustos ON matorral.Especie = arbustos.Codigo
    WHERE arboles.Nombre = 'Quercus ilex'")
acomp_encinas <- dbFetch(query)
dbClearResult(query)

Aunque el lenguaje SQL es el más extendida cuando hablamos de bases de datos, existen otras formas de trabajar con bases de datos que mantienen la misma lógica pero utilizan otras sintáxis.

Por ejemplo, si de nuevo quiero conocer cuáles son las especies acompañantes a las encinas adultas en cada parcela…

acomp_encinas_dplyr <- mayores %>%
  left_join(arboles, by = c("Especie" = "Codigo")) %>%
  filter(Nombre == "Quercus ilex") %>%
  select(Estadillo) %>%
  distinct() %>%
  left_join(matorral, by = c("Estadillo" = "Estadillo")) %>%
  left_join(arbustos, by = c("Especie" = "Codigo")) %>%
  select(Especie, Nombre) %>%
  distinct() %>%
  filter(!is.na(Especie))

Cerrar base de datos

EL pqeute RSQLite requiere cerrar la conexión con la base de datos cuando terminamos de trabajar con ella.

dbDisconnect(con)