TUTORIAL 1: Conceptos básicos de R

OBJETIVO: Determinar cuántas especies de diferentes taxones se han registrado en Edimburgo.

Escrito por Marly Daniela Quiroga Buitrago 07/03/2020 Universidad Nacional de Colombia.

Para instalar un paquete, se escribe install.packages(“package-name”), ya instalado se puede cargar usando library(package-name). En este caso se tomará como ejemplo el paquete dplyr, así:

install.packages(“dplyr”)

library(dplyr)
## Warning: package 'dplyr' was built under R version 3.6.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
Tenga en cuenta que hay comillas al instalar un paquete, pero no al cargarlo, y recuerde que los hashtags le permiten agregar notas útiles a su código. Un ejemplo de ruta de archivo es:
setwd("C:/Users/maquiroga/Documents/intro_to_R")

Importar y verificar datos

Se importaron los registros para 2000-2016 (de NBN Gateway ) y se guardaron como edidiv.csv. El signo “=” en el código sirve para asignar objetos.
edidiv <- read.csv("C:/Users/maquiroga/Documents/intro_to_R/CC-RBasics-master/CC-RBasics-master/edidiv.csv")
Para verificar que los datos se importaron sin errores, es bueno ejecutar este código y verificar la salida en la cosola. Por otra parte, la funcion head() muestra los primeros valores o de cabeza, la función tail() muestra las últimas filas o valores de cola.
head(edidiv)
##                      organisationName gridReference year         taxonName
## 1 Joint Nature Conservation Committee      NT265775 2000    Sterna hirundo
## 2 Joint Nature Conservation Committee      NT235775 2000    Sterna hirundo
## 3 Joint Nature Conservation Committee      NT235775 2000 Sterna paradisaea
## 4       British Trust for Ornithology          NT27 2000 Branta canadensis
## 5       British Trust for Ornithology          NT27 2000  Branta leucopsis
## 6     The Wildlife Information Centre         NT27S 2001     Turdus merula
##   taxonGroup
## 1       Bird
## 2       Bird
## 3       Bird
## 4       Bird
## 5       Bird
## 6       Bird
tail(edidiv) 
##                            organisationName gridReference year
## 25679                    The Mammal Society      NT278745 2016
## 25680                    The Mammal Society      NT277724 2016
## 25681                    The Mammal Society      NT266728 2016
## 25682                    The Mammal Society      NT270728 2016
## 25683                    The Mammal Society      NT257762 2016
## 25684 People's Trust for Endangered Species        NT2372 2016
##                   taxonName taxonGroup
## 25679  Sciurus carolinensis     Mammal
## 25680   Capreolus capreolus     Mammal
## 25681  Sciurus carolinensis     Mammal
## 25682 Oryctolagus cuniculus     Mammal
## 25683         Vulpes vulpes     Mammal
## 25684   Erinaceus europaeus     Mammal
La función str(nombre de objeto), muestra la estructura de sus datos, es decir, si las variables son continuas, enteras, categóricas o caracteres:
str(edidiv) 
## 'data.frame':    25684 obs. of  5 variables:
##  $ organisationName: Factor w/ 28 levels "BATS & The Millennium Link",..: 14 14 14 8 8 28 28 28 28 28 ...
##  $ gridReference   : Factor w/ 1938 levels "NT200701","NT200712",..: 1314 569 569 1412 1412 1671 1671 1671 1671 1671 ...
##  $ year            : int  2000 2000 2000 2000 2000 2001 2001 2001 2001 2001 ...
##  $ taxonName       : Factor w/ 1275 levels "Acarospora fuscata",..: 1126 1126 1127 192 193 1202 365 977 472 947 ...
##  $ taxonGroup      : Factor w/ 11 levels "Beetle","Bird",..: 2 2 2 2 2 2 2 2 2 2 ...
Cuando desee acceder solo a una columna de un marco de datos, agregue el nombre de la variable al nombre del objeto con un $ signo de dólar . Esta sintaxis permite ver, modificar y/o reasignar esta variable.Esta función muestra solo las primeras filas de esta columna (taxonGroup):
head(edidiv$taxonGroup) 
## [1] Bird Bird Bird Bird Bird Bird
## 11 Levels: Beetle Bird Butterfly Dragonfly Flowering.Plants ... Mollusc
Para saber de que tipo es la variable “taxonGroup”, y si se quiere forzar a ser otro tipo de variable se muestran las siguientes funciones:
edidiv$taxonGroup = as.factor(edidiv$taxonGroup)
En esta última linea de código, “as.factor()” convierte cualquier valor que coloque dentro en un factor. La transformación se almacena en el objeto, ejecutando nuevamente, se corrobora que la variable es leída como factor:
class(edidiv$taxonGroup)
## [1] "factor"
Haciendo más exploración, la función “dim()” muestra el número de filas y colunmas, la función “summary()” da un resumen de los datos y "summary(objeto$variable) da un resumen de esa variable particular (columna) en su conjunto de datos:
dim(edidiv) 
## [1] 25684     5
summary(edidiv) 
##                                              organisationName gridReference  
##  Biological Records Centre                           :6744    NT2673 : 2741  
##  RSPB                                                :5809    NT2773 : 2031  
##  Butterfly Conservation                              :3000    NT2873 : 1247  
##  Scottish Wildlife Trust                             :2070    NT2570 : 1001  
##  Conchological Society of Great Britain &amp; Ireland:1998    NT27   :  888  
##  The Wildlife Information Centre                     :1860    NT2871 :  767  
##  (Other)                                             :4203    (Other):17009  
##       year                      taxonName                taxonGroup  
##  Min.   :2000   Maniola jurtina      : 1710   Butterfly       :9670  
##  1st Qu.:2006   Aphantopus hyperantus: 1468   Bird            :7366  
##  Median :2009   Turdus merula        : 1112   Flowering.Plants:2625  
##  Mean   :2009   Lycaena phlaeas      :  972   Mollusc         :2226  
##  3rd Qu.:2011   Aglais urticae       :  959   Hymenopteran    :1391  
##  Max.   :2016   Aglais io            :  720   Mammal          : 960  
##                 (Other)              :18743   (Other)         :1446
summary(edidiv$taxonGroup)
##           Beetle             Bird        Butterfly        Dragonfly 
##              426             7366             9670              421 
## Flowering.Plants           Fungus     Hymenopteran           Lichen 
##             2625              334             1391              140 
##        Liverwort           Mammal          Mollusc 
##              125              960             2226

Calcular la riqueza de especies

Para explorar la biodiversidad de Edimburgo, crearemos un gráfico que muestre cuántas especies se registraron en cada grupo taxonómico. Para saber cuántas especies de aves, plantas, mamíferos, etc. hay en Edimburgo, primero se debe dividir “edidi”Hello" en varios objetos, cada uno con filas para un solo grupo taxonómico. Se hace esto con la función filter() del dplyr paquete.
Debido a que solo se quieren los escarabajos aquí, se dice: la variable taxonGroup DEBE SER EXACTAMENTE (==) Escarabajo, descarte todo lo demás del conjunto de datos, así:
Beetle = filter(edidiv, taxonGroup == "Beetle")
Ahora, solo se quieren los pajaros aquí, se dice: la variable taxonGroup DEBE SER EXACTAMENTE (==) pajaros, descarte todo lo demás del conjunto de datos, y asi sucesivamente se crean los objetos para los taxones restantes.
Bird = filter(edidiv, taxonGroup == "Bird")
Butterfly = filter(edidiv, taxonGroup == "Butterfly")
Dragonfly = filter(edidiv, taxonGroup == "Dragonfly")
Flowering.Plants = filter(edidiv, taxonGroup == "Flowering.Plants")
Fungus = filter(edidiv, taxonGroup == "Fungus")
Hymenopteran  = filter(edidiv, taxonGroup == "Hymenopteran")
Liverwort  = filter(edidiv, taxonGroup == "Liverwort")
Una vez que se haya creado el objeto para cada taxón, se puede calcular la riqueza de especies, es decir, el número de especies diferentes en cada grupo. Para esto, se anidarán dos funciones juntas: unique()que identifica diferentes especies y length()que las cuenta. Cada variable de conteo tiene una letra asignada (a,b,c,d,etc).
a = length(unique(Beetle$taxonName))
b = length(unique(Bird$taxonName))
c = length(unique(Butterfly$taxonName))
d = length(unique(Dragonfly$taxonName))
e = length(unique(Flowering.Plants$taxonName))
f = length(unique(Fungus$taxonName))
g = length(unique(Hymenopteran$taxonName))
h = length(unique(Liverwort$taxonName))
Para el primer caso de los escarabajos “Beetles” simplemente se coloca “a” y se corre, asi para todos los demas taxones.
a
## [1] 37
b
## [1] 86
c
## [1] 25
d
## [1] 11
e
## [1] 521
f
## [1] 219
g
## [1] 112
h
## [1] 40

Crear un vector y trazarlo

Teniendo la riqueza de especies para cada taxón, se pueden combinar todos esos valores en un vector. Este se hace usando la función “c()”, la cuál significa concatenar o encadenar, tambien se pueden agregar etiquetas con la función "names(), para que los valores no salgan de la nada.
biodiv <- c(a,b,c,d,e,f,g,h)
names(biodiv) = c("Beetle","Bird","Butterfly","Dragonfly","Flowering.Plants","Fungus","Hymenopteran","Liverwort")
Para visualizar la riqueza de especies de los diferentes taxones mediante un gráfico, se usa la función “barplot()”.
barplot(biodiv) 

##### Como hay cosas que no están del todo bien, para solucionarlas se puede usar la función “help()”, para obtener ayuda con el diagrama de barras y ayuda con el trazado en general.

help("barplot")
## starting httpd help server ... done
help("par")
Se puede ajustar las dimensiones para que el gráfico de barras se vea como se quiere, y también se debe agregar un nombre de archivo significativo.(personalizar el tamaño y la resolución de la imagen)
png("barplot.png", width=1600, height=600)
El código cex aumenta el tamaño de fuente cuando es mayor que uno y lo disminuye cuando es menor que uno.
barplot(biodiv, xlab="Taxa", ylab="Number of species",space = c(0.2,0.2,0.2,0.2,0.2,0.2,0.2), ylim=c(0,600), cex.names= 0.45, cex.axis=0.8, cex.lab=1, main = "Riqueza de especies")
## Warning in space + width: longitud de objeto mayor no es múltiplo de la longitud
## de uno menor

## Warning in space + width: longitud de objeto mayor no es múltiplo de la longitud
## de uno menor

Crear un Dataframe y trazarlo

Los dataframe son tablas de valores: tienen una estructura bidimensional con filas y columnas, donde cada columna puede tener un tipo de datos diferente. Se Utilizará la función “data.frame()”, pero primero se creará un objeto que contenga los nombres de todos los taxones (una columna) y otro objeto con todos los valores para la riqueza de especies de cada taxón (otra columna). Crear un objeto llamado “taxa” que contiene todos los nombres de taxa.
taxa = c("Beetle","Bird","Butterfly","Dragonfly","Flowering.Plants","Fungus","Hymenopteran","Liverwort")
Convertir este objeto en un factor, es decir, una variable categórica.
taxa_f = factor(taxa)
Combinando todos los valores para el número de especies en un objeto llamado riqueza.
richness = c(a, b, c, d, e, f, g, h)
Crear el dataframe a partir de los dos vectores.
biodata = data.frame(taxa_f, richness)
Guardando el archivo en el directorio de trabajo.
write.csv(biodata, file="biodata.csv")
Si se quiere crear y guardar un diagrama de barras usando el dataframe, se necesita cambiar ligeramente el código, ya que los dataframe pueden contener múltiples variables, se debe indicar a R exactamente cuál se quiere trazar. Como antes, se puede especificar columnas de un dataframe usando $:
png("barplot2.png", width = 1600, height = 600)
barplot(biodata$richness, names.arg = c("Beetle","Bird","Butterfly","Dragonfly","Flowering.Plants","Fungus","Hymenopteran","Liverwort"), xlab = "Taxa", ylab = "Number of species", ylim = c(0,600)) 

### RETO ##### ¿Puedes producir un diagrama de barras de la envergadura media de cada especie y guardarlo en tu computadora? ¿Cuál podría ser la función para calcular la media? Calcule la envergadura media de cada especie de ave. La función para hacer eso es simplemente: mean ()

sparrow <- mean(22, 24, 21)
kingfisher <- mean(26, 23, 25)
eagle <- mean(195, 201, 185)
hummingbird <- mean(8, 9, 9)
Hacer un vector:
wingspan <- c(sparrow, kingfisher, eagle, hummingbird)
Crear un vector de especies de aves:
bird_sp <- c("sparrow", "kingfisher", "eagle", "hummingbird")
La especie de ave está actualmente en forma de carácter, pero debería ser un factor. Vamos a arreglar eso:
class(bird_sp)
## [1] "character"
bird_sp <- as.factor(bird_sp)
class(bird_sp) 
## [1] "factor"
Luego, combinar los dos vectores en un dataframe, trazar el diagrama de barras y guardarlo en el archivo:
wings <- data.frame(bird_sp, wingspan)
png("wingspan_plot.png", width=800, height=600)
barplot(wings$wingspan, names.arg = wings$bird_sp, xlab = "Bird species", ylab = "Average wingspan (cm)", ylim = c(0, 200), col = "gold")