Ejercicios para la gestión de datos en R
En este documento, vamos a utilizar varios ejercicios para familiarizarnos con la gestión de datos en R. Les aconsejo:
fol_Datos <- "../Datos/"
fol_Results <- "../Resultados/"
En esta actividad vamos a utilizar un juego de datos de diatomeas de los ríos franceses que se utilizó para varios proyectos, incluído mi tesis de doctorado (Tison et al. 2005; Bottin et al. 2014).
El juego de datos está en la carpeta de los datos en un archivo “diatomeas.RData”. Se carga así:
[1] "sp_abund_mat" "reference_sites" "env_info"
[4] "coord_x_y"
Pueden ver que el archivo tiene variós elementos:
El juego de datos está organizado de una manera que permite hacer vinculos directos entre las tablas: todas los objetos se corresponden elemento por elemento.
Anotar: esa organización de los datos es una mala practica. Es mucho mejor utilizar nombres de sitios y referencias explicitas a esos nombres en cada una de las tablas, pero nos sirve para este primer ejercicio!
nrow(sp_abund_mat)
[1] 836
length(reference_sites)
[1] 836
nrow(env_info)
[1] 836
nrow(coord_x_y)
[1] 836
Dentro de las variables de caracterización ambiental, existen variables que nos interesan para el ejercicio.
La variable HER1Lyon permite separar las hydro-eco-regiones:
barplot(table(env_info$HER1Lyon),cex.names=.65,xlab="Hydro-Eco-Región de nivel 1",ylab="Número de muestreos")

La variable PH nos da el valor de potencial \(H^+\) (los valores más pequeños son las aguas más acidas, los valores más altos son las aguas más alcalinas).
hist(env_info$PH,main="",xlab="pH")

Para poder hacer este ejercicio, consultar la documentación sobre:
Además, puede ser útil mirar las ayudas de las funciones siguientes:
matrix para crear una matrizComparison para las pruebas booleanas ==, !=, >, >=, <Logic para los operadores logicos & y |as.logical y mode para cambiar el modo de variables numericas a logicascolSums y rowSums para calcular las sumas de las filas y columnas de un arrayquantile para calcular los cuantiles de valor de un vectorLa base de datos de diatomeas descrita en el primer ejercicio referencia los taxones por sus códigos, que están definidos por varios expertos europeos, pero esos códigos no son siempre especies, pueden corresponder a varios niveles taxonómicos.
Imaginemos que un grupo de investigadores quiere desarrollar un indice simple de calidad del agua como un cociente entre la abundancia de la familia Fragilariaceae y la familia Naviculaceae.
Ejercicio suplementario para utilizar el mismo tipo de razonamiento (solo para si tenemos tiempo):
¡Hacer una matriz por nivel taxonomico!
El archivo “diatomTaxonomy.RData” contiene 2 objetos:
La tabla que nos interesa es el data.frame “taxonomy”:
str(taxonomy)
'data.frame': 16739 obs. of 17 variables:
$ cd : chr "AAAP" "AAAR" "AABE" "AABL" ...
$ division : chr "Bacillariophyta" "Bacillariophyta" "Bacillariophyta" "Bacillariophyta" ...
$ subdivision : chr "Bacillariophytina" "Bacillariophytina" "Bacillariophytina" "Bacillariophytina" ...
$ class : chr "Bacillariophyceae" "Bacillariophyceae" "Bacillariophyceae" "Bacillariophyceae" ...
$ order : chr "Achnanthales" "Thalassiophysales" "Achnanthales" "Thalassiophysales" ...
$ suborder : chr NA NA NA NA ...
$ family : chr "Achnanthaceae" "Catenulaceae" "Achnanthaceae" "Catenulaceae" ...
$ genus : chr "Achnanthes" "Amphora" "Achnanthes" "Amphora" ...
$ species : chr "Achnanthes aapajaervensis" "Amphora acuta" "Achnanthes abundans" "Amphora abludens" ...
$ subspecies : chr NA NA NA NA ...
$ group : chr NA NA NA NA ...
$ variety : chr NA "var. arcuata" "var. elliptica" NA ...
$ form : chr NA NA NA NA ...
$ sp. : logi FALSE FALSE FALSE FALSE FALSE FALSE ...
$ authors_notes: chr "Cleve Euler " "var. arcuata (Schmidt in Schmidt & al.) Cleve " "var. elliptica Manguin in Bourrelly & Manguin " "Simonsen " ...
$ Family_Coste : chr "MO" NA "MO" NA ...
$ genus_cd : chr "ACHN" "AMPH" "ACHN" "AMPH" ...
Como pueden ver la primera columna contiene los códigos que tenemos como nombres de columna de la matriz sp_abund_mat
Este documento muestra como funcionan las funciones which y match que son útil para este ejercicio.
Este documento tiene información sobre bucles.
Pasar los datos contenidos en el archivo “fitosociologiaFagusFrancia.xlsx” en:
No modifiquen el archivo excel, todo se puede hacer en R, es por enfrentarse a este tipo de dificultades que nos mejoremos en R.
Para su tesis de doctorado en la universidad de Burdeos sobre las comunidades de los bosques de hayas y sus distribuciones en la región de Burdeos, Marion Walbott (2018) ha utilizado varios datos fitosociológicos antiguos. En el archivo, pueden ver la transcripción de las tablas fitosociologicas de Lapraz (1963).
Esa tablas utilizan una escala de Braun-Blanquet:
bbScale <-data.frame(
code=c("r","+",as.character(1:5)),
description= c("Menos del 1% de cobertura, 3-5 individuos", "Menos del 5% de cobertura, pocos individuos","~5% más individuos","5%-25%","25%-50%","50%-75%","75%-100%"),
minPercent=c(0,1,5,5,25,50,75),
maxPercent=c(1,5,5,25,50,75,100)
)
bbScale$finalVal <- (bbScale$minPercent+bbScale$maxPercent)/2
| code | description | minPercent | maxPercent | finalVal |
|---|---|---|---|---|
| r | Menos del 1% de cobertura, 3-5 individuos | 0 | 1 | 0.5 |
|
|
Menos del 5% de cobertura, pocos individuos | 1 | 5 | 3.0 |
| 1 | ~5% más individuos | 5 | 5 | 5.0 |
| 2 | 5%-25% | 5 | 25 | 15.0 |
| 3 | 25%-50% | 25 | 50 | 37.5 |
| 4 | 50%-75% | 50 | 75 | 62.5 |
| 5 | 75%-100% | 75 | 100 | 87.5 |
Para poder hacer este ejercicio, consultar la documentación sobre:
Además, puede ser útil mirar las ayudas de las funciones siguientes:
openxlsx::read.xlsx es una de las funciones para leer datos en archivos excel, no dudar en buscar los argumentos que les pueden facilitar el ejerciciois.na permite saber cuales son los valores que faltan en un vector, da un vector logicomatrix para crear una matrizcbind y rbind permiten concatenar arrays por filas o columnaspaste permite pegar varias cadenas de caracter juntasComparison para las pruebas booleanas ==, !=, >, >=, <Logic para los operadores logicos & y |as.logical y mode para cambiar el modo de variables numericas a logicasEn una base de datos, utilizamos este tipo de tablas para almacenar las abundancias o presencias de especies:
| Unidad de muestreo | Especie | abundancia |
|---|---|---|
| Bogotá | Canis lupus | 3000 |
| Bogotá | Felis catus | 1000 |
| Chingaza | Tremarctos ornatus | 50 |
| Chingaza | Canis lupus | 100 |
| Chingaza | Odocoileus virginianus | 200 |
Cuando vayamos a explorar las bases de datos estructuradas, les explicaré el porque de esa forma!
Desafortunadamente, los programas de análisis estadísticos funcionan mejor con este formato:
| Canis lupus | Felis catus | Tremarctos ornatus | Odocoileus virginianus | |
|---|---|---|---|---|
| Bogotá | 3000 | 1000 | 0 | 0 |
| Chingaza | 100 | 0 | 50 | 200 |
Nota, esas tablas se pueden crear en R para probar las funciones:
df_bog_chinga <- data.frame(
UniMuestreo=c(rep("Bogotá",2),rep("Chingaza",3)),
Especie=c("Canis lupus","Felis catus","Tremarctos ornatus","Canis lupus","Odocoileus virginianus"),
abundancia=c(3000,1000,50,100,200)
)
mat_bog_chinga <- matrix(c(3000,100,1000,0,0,50,0,200),nrow=2,dimnames=list(c("Bogotá","Chingaza"),c("Canis lupus","Felis catus","Tramarctos ornatus","Odocoileus viginianus")))
Contruir las funciones en R que permiten pasar de un formato “base de datos” a una matriz de abundancia o de presencia.
Las funciones deben tener los argumentos adecuados para :
Construir una función que permita utilizar el formato “base de datos” y hacer la suma de todos las filas que tienen el mismo taxon en la misma unidad de muestreo, y utilizarla para construir la matriz de genero de diatomeas (ver ejercicio previo).
Puede ser util mirar la documentación sobre: