# install.packages("RSQLite")
library(RSQLite)
# install.packages("dplyr")
library(dplyr)Ejercicio de bases de datos
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
RSQLiteydplyr.El material utilizado en este manual puede descargarse aquí y este mismo ejercicio en formato .qmd puede descargarse desde aquí.
Flujo de Trabajo
- Instalar y cargar paquetes
- Crear conexión con base de datos
- Montar base de datos
- Realizar consultas
- Cerrar base de datos
Instalar y cargar paquetes
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)