Tarea 5: R Avanzado

Debora Elías Díaz

2023-10-26

Contenido

Enlace Código en RPubs: Tarea 5: RPubs

# Cargar Paquetes a utilizar
library(knitr)
library(purrr)
library(gt)
library(DT)

Primer Ejercicio

  1. Haga un bucle for que una todos los datos contenidos en los archivos de texto en un solo cuadro de datos (‘data frame’, debe llamarse ‘datos_camaras’) y añada una columna con el nombre del archivo de donde provienen los datos (debe llamarse ‘archivo’; pistas: 1) añadir el nombre del archivo en una columna se hace en el cuerpo del bucle luego de leer el archivo; 2) recuerden usar basename()).

Llamar bases de datos

# Asignación de nombre al directorio
directorio <- "../data/raw/MaxN"

# hacer vector con nombre y direccion de archivos
archivos <-
  list.files(
    path = directorio,
    full.names = TRUE, # Puede brindar la ruta de direccion donde se encuentra
    pattern = "TXT$" #busca solo archivos que sea txt y ese txt esté hasta le final (formato o extensión del archivo)
  )


head(archivos)
## [1] "../data/raw/MaxN/2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT"       
## [2] "../data/raw/MaxN/2022-09-03_S6-LB13-RB12_PuntaMariaOeste_2022-03-24_MaxN.TXT"
## [3] "../data/raw/MaxN/2022-09-03_T4-LB19-RB18_PuntaMariaOeste_2022-03-24_MaxN.TXT"
## [4] "../data/raw/MaxN/2022-09-04_S1-LB10-RN9_Arco2_2022-07-15_MaxN.TXT"           
## [5] "../data/raw/MaxN/2022-09-07_P1-LB12-RB13_Gissler_2022-03-30_MaxN.TXT"        
## [6] "../data/raw/MaxN/2022-09-11_P1-LB14-RB13_Risco_2022-03-26_MaxN.TXT"

Desarrollo del bucle “for”

datos_camaras <- NULL # Fijar vector vacío


# Inicio del bucle for; se designa de qué conjunto de datos tomará los valores (i; en este ejemplo de las bases de datos denominadas "archivos")

for (i in archivos) {

# linea de código que nos ayuda a leer los datos contenidos en las bases "archivos"   

dtxt <- read.table(i, header = T, sep = "\t", fill = TRUE, skip = 4)

# línea de código para agregar la nueva columna ("archivo") con los nombres de la extensión o archivo del cual provienen

datos <- data.frame(archivo = basename(i), dtxt)

# guardar los resultados en el vector vacio del inicio

datos_camaras <- rbind(datos_camaras, datos)
}

Visualicación de datos

# Visualización de la tabla de datos: datos_camaras
head(datos_camaras, 10) |>
gt() |> 
tab_options(table.background.color = "#1C1C1C")
archivo Filename Frame Time..mins. Period Period.time..mins. OpCode TapeReader Depth Comment Date Site BRUVS.NO TimeIN TimeOUT Bait Lat Long Family Genus Species Code MaxN Has.fed
2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT GH018767_LcamT3.MP4 11451 3.1840 inicio 1.5504 R3-LcamT3-RcamN4_Pelada1_2021-09-24 Andres 10 NA 2021-09-25 Pelada1 R3-LcamT3-RcamN4_Pelada1_2021-09-24 10:23 11:52 Yes 10.87168 -85.88647 1 No
2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT GH018767_LcamT3.MP4 25005 6.9528 inicio 5.3192 R3-LcamT3-RcamN4_Pelada1_2021-09-24 Andres 10 NA 2021-09-25 Pelada1 R3-LcamT3-RcamN4_Pelada1_2021-09-24 10:23 11:52 Yes 10.87168 -85.88647 Acanthuridae Acanthurus xanthopterus Acaxantho 3 No
2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT GH028767_LcamT3.MP4 30464 24.5201 inicio 22.8865 R3-LcamT3-RcamN4_Pelada1_2021-09-24 Andres 10 NA 2021-09-25 Pelada1 R3-LcamT3-RcamN4_Pelada1_2021-09-24 10:23 11:52 Yes 10.87168 -85.88647 Acanthuridae Prionurus laticlavius Prilaticl 11 No
2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT GH018767_LcamT3.MP4 26911 7.4828 inicio 5.8492 R3-LcamT3-RcamN4_Pelada1_2021-09-24 Andres 10 NA 2021-09-25 Pelada1 R3-LcamT3-RcamN4_Pelada1_2021-09-24 10:23 11:52 Yes 10.87168 -85.88647 Balistidae 1 No
2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT GH048767_LcamT3.MP4 49845 62.0078 inicio 60.3742 R3-LcamT3-RcamN4_Pelada1_2021-09-24 Andres 10 NA 2021-09-25 Pelada1 R3-LcamT3-RcamN4_Pelada1_2021-09-24 10:23 11:52 Yes 10.87168 -85.88647 Balistidae Balistes polylepis Balpolyle 2 No
2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT GH018767_LcamT3.MP4 13064 3.6325 inicio 1.9989 R3-LcamT3-RcamN4_Pelada1_2021-09-24 Andres 10 NA 2021-09-25 Pelada1 R3-LcamT3-RcamN4_Pelada1_2021-09-24 10:23 11:52 Yes 10.87168 -85.88647 Balistidae Pseudobalistes naufragium Psenaufra 2 No
2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT GH028767_LcamT3.MP4 18678 21.2429 inicio 19.6093 R3-LcamT3-RcamN4_Pelada1_2021-09-24 Andres 10 NA 2021-09-25 Pelada1 R3-LcamT3-RcamN4_Pelada1_2021-09-24 10:23 11:52 Yes 10.87168 -85.88647 Balistidae Sufflamen verres Sufverres 1 No
2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT GH018767_LcamT3.MP4 31200 8.6753 inicio 7.0418 R3-LcamT3-RcamN4_Pelada1_2021-09-24 Andres 10 NA 2021-09-25 Pelada1 R3-LcamT3-RcamN4_Pelada1_2021-09-24 10:23 11:52 Yes 10.87168 -85.88647 Blenniidae Plagiotremus azaleus 2 No
2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT GH058767_LcamT3.MP4 4623 65.4829 inicio 63.8493 R3-LcamT3-RcamN4_Pelada1_2021-09-24 Andres 10 NA 2021-09-25 Pelada1 R3-LcamT3-RcamN4_Pelada1_2021-09-24 10:23 11:52 Yes 10.87168 -85.88647 Carangidae Caranx caballus Carcaball 3 No
2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT GH018767_LcamT3.MP4 29044 8.0758 inicio 6.4423 R3-LcamT3-RcamN4_Pelada1_2021-09-24 Andres 10 NA 2021-09-25 Pelada1 R3-LcamT3-RcamN4_Pelada1_2021-09-24 10:23 11:52 Yes 10.87168 -85.88647 Carangidae Elagatis bipinnulata Elabipinn 1 No

Segundo Ejercicio

  1. Haga un bucle sapply que devuelva el número de familias para cada archivo. El bucle debe usar los datos en el data frame ‘datos_camaras’ creado en el ejercicio 1 (no debe leer de nuevo los archivos de texto). El resultado debe ser guardado en un cuadro de datos (‘data frame’) que contenga las columnas ‘archivo’ y ‘n_familias’. (pistas: 1) necesitan crear una función en la llamada del bucle; 2) el bucle debe ciclar sobre cada uno de los nombres de archivo; 3) deben crear un subconjunto de los datos para cada archivo a lo interno del bucle). Las primeras 3 filas del cuadro de datos deben verse así:
include_graphics("../Images/Fig7.png")

Desarrollo del bucle “sapply”

# inicio del bucle, con lectura unique para cada archivo i en datos_camaras
n_familias <- sapply(X = unique(datos_camaras$archivo), FUN = function(i) {

# línea de código para generar un subconjunto de datos para cada archivo i
d_camaras <- datos_camaras[datos_camaras$archivo == i, ]

# línea de código para número de familias unicas en cada archivo i
fam <- length(unique(d_camaras$Family))
})

# línea de código para generar el data frame resumen con nombre de archivos y número de familias
dff <- data.frame(archivo = basename(unique(datos_camaras$archivo)), n_familias)

Visualización de datos

gt(dff) |> 
tab_options(table.background.color = "#1C1C1C")
archivo n_familias
2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT 19
2022-09-03_S6-LB13-RB12_PuntaMariaOeste_2022-03-24_MaxN.TXT 1
2022-09-03_T4-LB19-RB18_PuntaMariaOeste_2022-03-24_MaxN.TXT 2
2022-09-04_S1-LB10-RN9_Arco2_2022-07-15_MaxN.TXT 8
2022-09-07_P1-LB12-RB13_Gissler_2022-03-30_MaxN.TXT 7
2022-09-11_P1-LB14-RB13_Risco_2022-03-26_MaxN.TXT 5
2022-09-12_S6-LN4-RN8_Chatham_2022-03-28_MaxN.TXT 5
2022-09-14_R2C4_Catalinas1_21-7-2021_MaxN.TXT 5
2022-09-14_S2C4_Virador1-20-7-2021_MaxN.TXT 20
2022-09-14_S6-LB7-RB8_Silverado_2022-03-28_MaxN.TXT 16
2022-09-15_S6-LB9-RB11_Vikinga_2022-03-30_MaxN.TXT 14
2022-09-15_T4-LcamT8-RcamOFI-5_Barlovento2_2021-10-17_MaxN.TXT 7
2022-09-16_S2C8_Bajo Rojo1_2021-07-28_MaxN.TXT 18
2022-09-16_T4-LcamN5-RcamT6_ISJ2_2021-09-25_MaxN.TXT 19
2022-09-17_SB3-LcamT4-RcamN6_CanalSJ_2021-09-25_MaxN.TXT 15
2022-09-20_T3C7_Dampier2_2021-10-19_MaxN.TXT 9
2022-09-22_T4-LN9-RT1_Bautista_2022-03-26_MaxN.TXT 5
2022-09-24_T4-LcamT3-RcamSN7_Esfinge2_2021-10-17_MaxN.TXT 6
2022-09-25_T3C2_SJ2_2021-09-25_MaxN.TXT 18

Tercer Ejercicio

  1. Haga un bucle sapply que devuelva el número de géneros (columna ‘genus’) para cada archivo. El bucle debe usar los datos en el data frame ‘datos_camaras’ creado en el ejercicio 1 (no debe leer de nuevo los archivos de texto). El resultado debe ser añadido como una nueva columna al cuadro de datos creado en el ejercicio 2. Las primeras 3 filas del cuadro de datos deben verse así:
include_graphics("../Images/Fig8.png")

Desarrollo del bucle “sapply”

# inicio del bucle, con lectura unique para cada archivo i en datos_camaras
n_generos <- sapply(X = unique(datos_camaras$archivo), FUN = function(i) {

# línea de código para generar un subconjunto de datos para cada archivo i
d_camaras <- datos_camaras[datos_camaras$archivo == i, ]

# línea de código para número de géneros unicos en cada archivo i
gen <- length(unique(d_camaras$Genus))
})

# línea de código para generar el data frame resumen con nombre de archivos y número de familias
dfg <- data.frame(archivo = basename(unique(datos_camaras$archivo)), n_familias, n_generos)

Visualización de datos

gt(dfg) |> 
tab_options(table.background.color = "#1C1C1C")
archivo n_familias n_generos
2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT 19 32
2022-09-03_S6-LB13-RB12_PuntaMariaOeste_2022-03-24_MaxN.TXT 1 1
2022-09-03_T4-LB19-RB18_PuntaMariaOeste_2022-03-24_MaxN.TXT 2 2
2022-09-04_S1-LB10-RN9_Arco2_2022-07-15_MaxN.TXT 8 11
2022-09-07_P1-LB12-RB13_Gissler_2022-03-30_MaxN.TXT 7 11
2022-09-11_P1-LB14-RB13_Risco_2022-03-26_MaxN.TXT 5 8
2022-09-12_S6-LN4-RN8_Chatham_2022-03-28_MaxN.TXT 5 9
2022-09-14_R2C4_Catalinas1_21-7-2021_MaxN.TXT 5 8
2022-09-14_S2C4_Virador1-20-7-2021_MaxN.TXT 20 25
2022-09-14_S6-LB7-RB8_Silverado_2022-03-28_MaxN.TXT 16 30
2022-09-15_S6-LB9-RB11_Vikinga_2022-03-30_MaxN.TXT 14 20
2022-09-15_T4-LcamT8-RcamOFI-5_Barlovento2_2021-10-17_MaxN.TXT 7 11
2022-09-16_S2C8_Bajo Rojo1_2021-07-28_MaxN.TXT 18 20
2022-09-16_T4-LcamN5-RcamT6_ISJ2_2021-09-25_MaxN.TXT 19 24
2022-09-17_SB3-LcamT4-RcamN6_CanalSJ_2021-09-25_MaxN.TXT 15 27
2022-09-20_T3C7_Dampier2_2021-10-19_MaxN.TXT 9 17
2022-09-22_T4-LN9-RT1_Bautista_2022-03-26_MaxN.TXT 5 7
2022-09-24_T4-LcamT3-RcamSN7_Esfinge2_2021-10-17_MaxN.TXT 6 10
2022-09-25_T3C2_SJ2_2021-09-25_MaxN.TXT 18 24

Cuarto Ejercicio

  1. Haga un bucle sapply que devuelva la fecha de creación del video para cada archivo. El bucle debe usar los datos en el data frame ‘datos_camaras’ creado en el ejercicio 1 (no debe leer de nuevo los archivos de texto). El resultado debe ser añadido como una nueva columna al cuadro de datos creado en el ejercicio 2. Las primeras 3 filas del cuadro de datos deben verse así:
include_graphics("../Images/Fig9.png")

Desarrollo del bucle “sapply”

# inicio del bucle, con lectura unique para cada archivo i en datos_camaras
Fecha <- sapply(X = unique(datos_camaras$archivo), FUN = function(i) {

# línea de código para generar un subconjunto de datos para cada archivo i
d_camaras <- datos_camaras[datos_camaras$archivo == i, ]

# línea de código para número de géneros unicos en cada archivo i
date <- length(unique(d_camaras$Date))
})

# línea de código para generar el data frame resumen con nombre de archivos y número de familias
dffch <- data.frame(archivo = basename(unique(datos_camaras$archivo)), n_familias, n_generos, Fecha)

Visualización de datos

gt(dffch) |> 
tab_options(table.background.color = "#1C1C1C")
archivo n_familias n_generos Fecha
2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT 19 32 1
2022-09-03_S6-LB13-RB12_PuntaMariaOeste_2022-03-24_MaxN.TXT 1 1 1
2022-09-03_T4-LB19-RB18_PuntaMariaOeste_2022-03-24_MaxN.TXT 2 2 1
2022-09-04_S1-LB10-RN9_Arco2_2022-07-15_MaxN.TXT 8 11 1
2022-09-07_P1-LB12-RB13_Gissler_2022-03-30_MaxN.TXT 7 11 1
2022-09-11_P1-LB14-RB13_Risco_2022-03-26_MaxN.TXT 5 8 1
2022-09-12_S6-LN4-RN8_Chatham_2022-03-28_MaxN.TXT 5 9 1
2022-09-14_R2C4_Catalinas1_21-7-2021_MaxN.TXT 5 8 1
2022-09-14_S2C4_Virador1-20-7-2021_MaxN.TXT 20 25 1
2022-09-14_S6-LB7-RB8_Silverado_2022-03-28_MaxN.TXT 16 30 1
2022-09-15_S6-LB9-RB11_Vikinga_2022-03-30_MaxN.TXT 14 20 1
2022-09-15_T4-LcamT8-RcamOFI-5_Barlovento2_2021-10-17_MaxN.TXT 7 11 1
2022-09-16_S2C8_Bajo Rojo1_2021-07-28_MaxN.TXT 18 20 1
2022-09-16_T4-LcamN5-RcamT6_ISJ2_2021-09-25_MaxN.TXT 19 24 1
2022-09-17_SB3-LcamT4-RcamN6_CanalSJ_2021-09-25_MaxN.TXT 15 27 1
2022-09-20_T3C7_Dampier2_2021-10-19_MaxN.TXT 9 17 1
2022-09-22_T4-LN9-RT1_Bautista_2022-03-26_MaxN.TXT 5 7 1
2022-09-24_T4-LcamT3-RcamSN7_Esfinge2_2021-10-17_MaxN.TXT 6 10 1
2022-09-25_T3C2_SJ2_2021-09-25_MaxN.TXT 18 24 1

Quinto Ejercicio

  1. Haga un bucle sapply que calcule el número de veces que se observó cada especie. El bucle debe trabajar sobre el data frame ‘datos_camaras’ creado en el ejercicio 1 (no debe leer de nuevo los archivos de texto) y el cálculo debe ser la suma de la columna ‘MaxN’. Ponga los resultados en un cuadro de datos con columnas para especie y número de observaciones. (pista: unique(datos_camaras$Species)). Remueva el campo en el que especie es igual a ““. Las primeras 3 filas del cuadro de datos deben verse así:
include_graphics("../Images/Fig11.png")

Desarrollo del bucle “sapply”

spp <- unique(datos_camaras$Species)[-1] # Línea de código que me ayuda a generar el listado unico de especies de la base de datos, se omite [-1] el primer valor denominado ("")

n_obs <- sapply(X = spp, FUN = function(i) { #observaciones en relacion a las especies

# línea de código para generar un subconjunto de datos para cada archivo i
d_camaras <- datos_camaras[datos_camaras$Species == i, ]

# línea de código para número de especies unicas en cada archivo i
especies <- (unique(d_camaras$Species))

# Línea de código para el cálculo del número de veces que se observó la spp
obs <- sum(d_camaras$MaxN) 

})

# línea de código para generar el data frame resumen con nombre de archivos y número de familias
dfsp <- data.frame(spp, n_obs)

Visualización de datos

datatable(dfsp) |> formatStyle(
  'spp',
  backgroundColor = "#B2F2FF")

Sexto Ejercicio

  1. Utilice bucles sapply para añadir el mínimo y máximo de la profundidad para cada una de las especies en el cuadro de datos creado en el ejercicio anterior (pistas: 1) asegúrese que la columna de profundidad es numérica antes de calcular las profundidades; 2) gsub(” m”, ““, vector); 3) gsub(”,“,”.”, vector); 4) as.numeric()). Las primeras 3 filas del cuadro de datos deben verse así:

Desarrollo del bucle “sapply”

# Profundidad máxima

datos_camaras[9] <- map_df(datos_camaras[9], ~ gsub(" m", "", .x)) #solucionar errores que se encuentran en la base original, de escritura por ejemplo (valores con letras, o signos diferentes, tal como: comas o puntos en el caso de los decimales)

datos_camaras[9] <- map_df(datos_camaras[9], ~ gsub(",", ".", .x))

# Transforma a variable numerica la profundidad
datos_camaras$Depth <- as.numeric(datos_camaras$Depth)


max_prof <- sapply(X = spp, FUN = function(i) { 
    
d_camaras <- datos_camaras[datos_camaras$Species == i, ] # # línea de código para generar un subconjunto de datos para cada archivo i
    
maxi_prof <- max(d_camaras$Depth) # profundida mínima a la que se encontró (i) especie
    
})

# Profundidad mínima

min_prof <- sapply(X = spp, FUN = function(i) { 
    
d_camaras <- datos_camaras[datos_camaras$Species == i, ] # línea de código para generar un subconjunto de datos para cada archivo i
    
mini_prof <- min(d_camaras$Depth) # profundida mínima a la que se encontró (i) especie

})

dfmin <- data.frame(spp, n_obs, min_prof, max_prof)

Visualización de datos

datatable(dfmin)

Séptimo Ejercicio

  1. Calcule el rango de profundidad (i.e. la diferencia entre el mínimo y el máximo de la profundidad) para cada especie y añádalo como una columna al cuadro de datos creado en el ejercicio 5. Las primeras 3 filas del cuadro de datos deben verse así:
include_graphics("../Images/Fig12.png")

Desarrollo del bucle “sapply”

datos_camaras$Depth <- as.numeric(datos_camaras$Depth) # Nota para mi: Recordar verificar que las variables se encuentren definidas correctamentamente, tal como: numericas, factores.

rango <- sapply(X = spp,  FUN = function(i) {
    
    d_camaras <- datos_camaras[datos_camaras$Species == i, ] # línea de código para generar un subconjunto de datos para cada archivo i
    
    ran <- abs(max(datos_camaras$Depth) - min(datos_camaras$Depth)) # línea de código para calcular el rango de profundidad a la que se encontró cada especie

    })

dft <- data.frame(spp, n_obs, min_prof, max_prof, rango) # se agrega el nuevo resultado "rango" al df de base

Octavo Ejercicio

datatable(dft)
## R version 4.1.3 (2022-03-10)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 22621)
## 
## Matrix products: default
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] DT_0.30     gt_0.10.0   purrr_1.0.1 knitr_1.44 
## 
## loaded via a namespace (and not attached):
##  [1] rstudioapi_0.15.0 xml2_1.3.3        magrittr_2.0.3    tidyselect_1.2.0 
##  [5] R6_2.5.1          rlang_1.1.0       fastmap_1.1.1     fansi_1.0.4      
##  [9] dplyr_1.1.2       tools_4.1.3       xfun_0.39         utf8_1.2.3       
## [13] cli_3.6.1         withr_2.5.1       jquerylib_0.1.4   ellipsis_0.3.2   
## [17] crosstalk_1.2.0   htmltools_0.5.5   yaml_2.3.7        digest_0.6.31    
## [21] tibble_3.2.1      lifecycle_1.0.3   bookdown_0.35     htmlwidgets_1.6.2
## [25] sass_0.4.5        vctrs_0.6.1       glue_1.6.2        cachem_1.0.7     
## [29] evaluate_0.22     rmarkdown_2.25    compiler_4.1.3    bslib_0.5.1      
## [33] pillar_1.9.0      generics_0.1.3    rmdformats_1.0.4  jsonlite_1.8.4   
## [37] pkgconfig_2.0.3