library(DT)
# definir directorio a donde guardar los archivos
directorio <- "~/Desktop/Recursos_R/r_avanzado/scripts/datos_bucles"
# hacer vector con nombre y direccion de archivos
archivos_txt <-
list.files(
path = directorio,
full.names = TRUE,
pattern = "TXT$" # crea lista de archivos en wd con terminación específica.
)
# Verificar vector
length(archivos_txt)
## [1] 19
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()).
datos_camaras <- vector() # vector vacío
# inicio del bucle
for (i in archivos_txt) { #lee cada archivo, i son los archivos que son elementos de la lista archivos_txt
# leer archivo
txt <- read.table(i, header = TRUE, skip = 4, sep = "\t") #lee cada archivo, que serian los i
archivo <- basename(i) # extrae el nombre del archivo
datos <- data.frame(archivo, txt) # adjunta en una base el nombre del archivo con los datos extraídos
datos_camaras <- rbind(datos_camaras, datos) # une cada base de datos hecha previamente en una sola, por fila.
# guardar resultados en vector vacio
}
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í:
arch <- unique(datos_camaras$archivo) # crea un vector de factores de los archivos.
arch
## [1] "2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT"
## [2] "2022-09-03_S6-LB13-RB12_PuntaMariaOeste_2022-03-24_MaxN.TXT"
## [3] "2022-09-03_T4-LB19-RB18_PuntaMariaOeste_2022-03-24_MaxN.TXT"
## [4] "2022-09-04_S1-LB10-RN9_Arco2_2022-07-15_MaxN.TXT"
## [5] "2022-09-07_P1-LB12-RB13_Gissler_2022-03-30_MaxN.TXT"
## [6] "2022-09-11_P1-LB14-RB13_Risco_2022-03-26_MaxN.TXT"
## [7] "2022-09-12_S6-LN4-RN8_Chatham_2022-03-28_MaxN.TXT"
## [8] "2022-09-14_R2C4_Catalinas1_21-7-2021_MaxN.TXT"
## [9] "2022-09-14_S2C4_Virador1-20-7-2021_MaxN.TXT"
## [10] "2022-09-14_S6-LB7-RB8_Silverado_2022-03-28_MaxN.TXT"
## [11] "2022-09-15_S6-LB9-RB11_Vikinga_2022-03-30_MaxN.TXT"
## [12] "2022-09-15_T4-LcamT8-RcamOFI-5_Barlovento2_2021-10-17_MaxN.TXT"
## [13] "2022-09-16_S2C8_Bajo Rojo1_2021-07-28_MaxN.TXT"
## [14] "2022-09-16_T4-LcamN5-RcamT6_ISJ2_2021-09-25_MaxN.TXT"
## [15] "2022-09-17_SB3-LcamT4-RcamN6_CanalSJ_2021-09-25_MaxN.TXT"
## [16] "2022-09-20_T3C7_Dampier2_2021-10-19_MaxN.TXT"
## [17] "2022-09-22_T4-LN9-RT1_Bautista_2022-03-26_MaxN.TXT"
## [18] "2022-09-24_T4-LcamT3-RcamSN7_Esfinge2_2021-10-17_MaxN.TXT"
## [19] "2022-09-25_T3C2_SJ2_2021-09-25_MaxN.TXT"
length(unique(datos_camaras$Family)) # significa que en total hay 33 familias unicas, quiero saber cuantas familias unicas hay por archivo
## [1] 33
# Bucle sapply
n_familias <- sapply(X = arch, FUN = function(X){ # x es el vector de arch, con los archivos como niveles
fam <- length(unique(datos_camaras$Family[datos_camaras$archivo == X ])) # extrae la cantidad de familias únicas de acuerdo a los datos de archivo, usando el subconjunto arch como niveles.
})
n_familias # vector familias por archivo.
## 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
resultados <- data.frame("archivo" = arch, n_familias) # dataframe con los resultados previos, se selecciona solo la columna de valores, sin los nombres de las filas que ya viene dado por arch
resultados
## archivo
## 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT
## 2022-09-03_S6-LB13-RB12_PuntaMariaOeste_2022-03-24_MaxN.TXT 2022-09-03_S6-LB13-RB12_PuntaMariaOeste_2022-03-24_MaxN.TXT
## 2022-09-03_T4-LB19-RB18_PuntaMariaOeste_2022-03-24_MaxN.TXT 2022-09-03_T4-LB19-RB18_PuntaMariaOeste_2022-03-24_MaxN.TXT
## 2022-09-04_S1-LB10-RN9_Arco2_2022-07-15_MaxN.TXT 2022-09-04_S1-LB10-RN9_Arco2_2022-07-15_MaxN.TXT
## 2022-09-07_P1-LB12-RB13_Gissler_2022-03-30_MaxN.TXT 2022-09-07_P1-LB12-RB13_Gissler_2022-03-30_MaxN.TXT
## 2022-09-11_P1-LB14-RB13_Risco_2022-03-26_MaxN.TXT 2022-09-11_P1-LB14-RB13_Risco_2022-03-26_MaxN.TXT
## 2022-09-12_S6-LN4-RN8_Chatham_2022-03-28_MaxN.TXT 2022-09-12_S6-LN4-RN8_Chatham_2022-03-28_MaxN.TXT
## 2022-09-14_R2C4_Catalinas1_21-7-2021_MaxN.TXT 2022-09-14_R2C4_Catalinas1_21-7-2021_MaxN.TXT
## 2022-09-14_S2C4_Virador1-20-7-2021_MaxN.TXT 2022-09-14_S2C4_Virador1-20-7-2021_MaxN.TXT
## 2022-09-14_S6-LB7-RB8_Silverado_2022-03-28_MaxN.TXT 2022-09-14_S6-LB7-RB8_Silverado_2022-03-28_MaxN.TXT
## 2022-09-15_S6-LB9-RB11_Vikinga_2022-03-30_MaxN.TXT 2022-09-15_S6-LB9-RB11_Vikinga_2022-03-30_MaxN.TXT
## 2022-09-15_T4-LcamT8-RcamOFI-5_Barlovento2_2021-10-17_MaxN.TXT 2022-09-15_T4-LcamT8-RcamOFI-5_Barlovento2_2021-10-17_MaxN.TXT
## 2022-09-16_S2C8_Bajo Rojo1_2021-07-28_MaxN.TXT 2022-09-16_S2C8_Bajo Rojo1_2021-07-28_MaxN.TXT
## 2022-09-16_T4-LcamN5-RcamT6_ISJ2_2021-09-25_MaxN.TXT 2022-09-16_T4-LcamN5-RcamT6_ISJ2_2021-09-25_MaxN.TXT
## 2022-09-17_SB3-LcamT4-RcamN6_CanalSJ_2021-09-25_MaxN.TXT 2022-09-17_SB3-LcamT4-RcamN6_CanalSJ_2021-09-25_MaxN.TXT
## 2022-09-20_T3C7_Dampier2_2021-10-19_MaxN.TXT 2022-09-20_T3C7_Dampier2_2021-10-19_MaxN.TXT
## 2022-09-22_T4-LN9-RT1_Bautista_2022-03-26_MaxN.TXT 2022-09-22_T4-LN9-RT1_Bautista_2022-03-26_MaxN.TXT
## 2022-09-24_T4-LcamT3-RcamSN7_Esfinge2_2021-10-17_MaxN.TXT 2022-09-24_T4-LcamT3-RcamSN7_Esfinge2_2021-10-17_MaxN.TXT
## 2022-09-25_T3C2_SJ2_2021-09-25_MaxN.TXT 2022-09-25_T3C2_SJ2_2021-09-25_MaxN.TXT
## 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
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í:
# Bucle sapply
n_generos <- sapply(X = arch, FUN = function(X){ # x es el vector de arch, con los archivos como niveles
gen <- length(unique(datos_camaras$Genus[datos_camaras$archivo == X ])) # extrae la cantidad de géneros únicos de acuerdo a los datos de archivo, usando el subconjunto arch como niveles.
})
n_generos # vector géneros por archivo.
resultados$n_generos <- n_generos # adjunta el vector creado por sapply como una nueva columna dentro de resultados
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í:
# Bucle sapply
date <- sapply(X = arch, FUN = function(X){
date <- length(unique(datos_camaras$Date[datos_camaras$archivo == X ])) # extrae fechas unicas dentro de los archivos.
})
resultados$date <- date # adjunta el vector creado por sapply como una nueva columna dentro de resultados
datatable(resultados)
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í:
spp <- datos_camaras$Species[-c(1,4, 148)] # subconjunto de las especies, con celdas vacías eliminadas
spp <- unique(spp) # crear vector del subconjunto con especies unicas como niveles
spp
## [1] "xanthopterus" "laticlavius" "polylepis" "naufragium"
## [5] "verres" "azaleus" "caballus" "bipinnulata"
## [9] "humeralis" "nigrirostris" "holocanthus" "maculicauda"
## [13] "steindachneri" "elegans" "diplotaenia" "chierchiae"
## [17] "dispilus" "melanotis" "nicholsi" "taeniourus"
## [21] "lucasanum" "argentiventris" "scriptus" "dentatus"
## [25] "castaneus" "passer" "troschelii" "atrilobata"
## [29] "acapulcoensis" "flavilatus" "ghobban" "rubroviolaceus"
## [33] "panamensis" "labriformis" "colonus" "psittacinus"
## [37] "punctatissima" "lewini" "maculata" "audax"
## [41] "melampygus" "mydas" "guentherii" "viridis"
## [45] "nigricans" "niger" "lugubris" "macarellus"
## [49] "obesus" "ocyurus" "jordani" "novemfasciatus"
## [53] "ciliaris" "rivoliana" "limbatus" "meyeni"
## [57] "albimarginatus" "galapagensis" "scudderii" "refulgens"
## [61] "sexfasciatus" "longa" "commersonii" "flaviguttatum"
## [65] "sexfasciatum" "guttatus" "narinari" "brachysomus"
## [69] "meleagris" "halleri" "mento" "interruptus"
## [73] "discolor" "grammaticum" "dovii" "arcifrons"
## [77] "dermatolepis" "cornutus" "berndti" "flavimarginatus"
## [81] "panamaensis" "dorsalis" "cuvier" "monoceros"
## [85] "nebulosa" "inermis" "speciosus" "unami"
## [89] "hispidus" "zonipectus" "xenarcha" "olfax"
## [93] "falciformis" "albacares" "hystrix" "aratus"
# Bucle sapply
n_obs <- sapply(X = spp, FUN = function(X){
obs <- sum(datos_camaras$MaxN[datos_camaras$Species == X]) #observaciones como la suma de los individuos obs por spp
})
n_obs
## xanthopterus laticlavius polylepis naufragium verres
## 145 25 26 3 21
## azaleus caballus bipinnulata humeralis nigrirostris
## 23 370 23 10 15
## holocanthus maculicauda steindachneri elegans diplotaenia
## 13 552 11 18 10
## chierchiae dispilus melanotis nicholsi taeniourus
## 2 123 1 2 1
## lucasanum argentiventris scriptus dentatus castaneus
## 31 78 1 42 5
## passer troschelii atrilobata acapulcoensis flavilatus
## 10 50 625 8 6
## ghobban rubroviolaceus panamensis labriformis colonus
## 38 6 3 10 213
## psittacinus punctatissima lewini maculata audax
## 4 5 14 72 1
## melampygus mydas guentherii viridis nigricans
## 50 6 10 43 3
## niger lugubris macarellus obesus ocyurus
## 70 7 1 20 1
## jordani novemfasciatus ciliaris rivoliana limbatus
## 4 6 5 9 4
## meyeni albimarginatus galapagensis scudderii refulgens
## 7 6 6 2 3
## sexfasciatus longa commersonii flaviguttatum sexfasciatum
## 1 2 8 318 20
## guttatus narinari brachysomus meleagris halleri
## 112 2 4 5 2
## mento interruptus discolor grammaticum dovii
## 7 12 1 3 1
## arcifrons dermatolepis cornutus berndti flavimarginatus
## 10 15 3 4 1
## panamaensis dorsalis cuvier monoceros nebulosa
## 1 1 2 1 1
## inermis speciosus unami hispidus zonipectus
## 9 8 5 2 1
## xenarcha olfax falciformis albacares hystrix
## 1 4 2 1 1
## aratus
## 1
obs.spp <- data.frame(n_obs)
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í:
# Profundidad como factor numerico
datos_camaras$Depth <- gsub(" m", "", gsub("\\,", ".", datos_camaras$Depth)) #se sustituyen caracteres en columna
datos_camaras$Depth <- as.numeric(datos_camaras$Depth) # se define como numerico
# Bucles sapply
min_prof <- sapply(X = spp, function(x){
min <- min(datos_camaras$Depth[datos_camaras$Species == x]) #extrae min
})
min_prof
## xanthopterus laticlavius polylepis naufragium verres
## 6.4 9.6 9.6 10.0 6.4
## azaleus caballus bipinnulata humeralis nigrirostris
## 9.6 9.6 6.4 10.0 9.6
## holocanthus maculicauda steindachneri elegans diplotaenia
## 9.6 10.0 10.0 10.0 10.0
## chierchiae dispilus melanotis nicholsi taeniourus
## 10.0 9.6 10.0 10.0 10.0
## lucasanum argentiventris scriptus dentatus castaneus
## 9.6 10.0 10.0 10.0 9.6
## passer troschelii atrilobata acapulcoensis flavilatus
## 9.6 9.6 9.6 9.6 9.6
## ghobban rubroviolaceus panamensis labriformis colonus
## 9.6 6.4 10.0 10.0 9.6
## psittacinus punctatissima lewini maculata audax
## 10.0 9.6 10.0 6.4 10.0
## melampygus mydas guentherii viridis nigricans
## 6.4 9.6 9.6 21.0 6.4
## niger lugubris macarellus obesus ocyurus
## 6.4 6.4 6.4 6.4 6.4
## jordani novemfasciatus ciliaris rivoliana limbatus
## 6.4 6.4 23.6 9.6 23.6
## meyeni albimarginatus galapagensis scudderii refulgens
## 23.4 23.6 23.6 23.6 9.6
## sexfasciatus longa commersonii flaviguttatum sexfasciatum
## 10.0 10.0 9.6 9.6 10.0
## guttatus narinari brachysomus meleagris halleri
## 10.0 9.6 10.0 9.6 10.0
## mento interruptus discolor grammaticum dovii
## 23.6 23.6 23.6 23.4 23.6
## arcifrons dermatolepis cornutus berndti flavimarginatus
## 23.4 23.6 23.4 23.4 23.4
## panamaensis dorsalis cuvier monoceros nebulosa
## 23.4 23.4 28.0 17.0 17.0
## inermis speciosus unami hispidus zonipectus
## 9.6 9.6 9.6 9.6 18.6
## xenarcha olfax falciformis albacares hystrix
## 18.6 31.6 28.0 28.0 13.0
## aratus
## 13.0
max_prof <- sapply(X = spp, function(x){
max <- max(datos_camaras$Depth[datos_camaras$Species == x]) #extrae max
})
max_prof
## xanthopterus laticlavius polylepis naufragium verres
## 31.6 31.6 30.0 18.6 21.0
## azaleus caballus bipinnulata humeralis nigrirostris
## 17.0 28.1 30.0 18.6 18.6
## holocanthus maculicauda steindachneri elegans diplotaenia
## 17.0 18.6 10.0 10.0 23.6
## chierchiae dispilus melanotis nicholsi taeniourus
## 10.0 23.6 10.0 10.0 10.0
## lucasanum argentiventris scriptus dentatus castaneus
## 23.6 31.6 10.0 30.0 13.0
## passer troschelii atrilobata acapulcoensis flavilatus
## 23.6 18.6 13.0 10.0 18.6
## ghobban rubroviolaceus panamensis labriformis colonus
## 18.6 31.6 23.6 23.6 31.6
## psittacinus punctatissima lewini maculata audax
## 10.0 13.0 30.0 31.6 10.0
## melampygus mydas guentherii viridis nigricans
## 31.6 21.0 23.6 23.4 31.6
## niger lugubris macarellus obesus ocyurus
## 31.6 31.6 6.4 31.6 6.4
## jordani novemfasciatus ciliaris rivoliana limbatus
## 6.4 23.6 31.6 31.6 28.1
## meyeni albimarginatus galapagensis scudderii refulgens
## 31.6 30.0 31.6 28.1 9.6
## sexfasciatus longa commersonii flaviguttatum sexfasciatum
## 10.0 17.0 23.6 17.0 18.6
## guttatus narinari brachysomus meleagris halleri
## 17.0 10.0 17.0 17.0 17.0
## mento interruptus discolor grammaticum dovii
## 31.6 30.0 23.6 23.6 23.6
## arcifrons dermatolepis cornutus berndti flavimarginatus
## 23.6 31.6 31.6 23.4 23.4
## panamaensis dorsalis cuvier monoceros nebulosa
## 23.4 23.4 30.0 17.0 17.0
## inermis speciosus unami hispidus zonipectus
## 13.0 18.6 18.6 18.6 18.6
## xenarcha olfax falciformis albacares hystrix
## 18.6 31.6 28.0 28.0 13.0
## aratus
## 13.0
obs.spp <- data.frame(n_obs, min_prof, max_prof) # se adjuntan a base de datos
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í:
rango_prof <- obs.spp$max_prof - obs.spp$min_prof #calculo de rango
obs.spp$rango_prof <- round(rango_prof, 2) # adjunta rango redondeado a dos dig a base
Incluya el cuadro de datos generado en los ejercicios 5 a 7 como una tabla en su reporte usando la función DT del paquete datatable.
datatable(obs.spp)