########## ### G.S.Vidaurre June 2015 # Laboratorio V ### Objetivos: # escribir frases condicionales con if() y else() # usar frases condicionales dentro de funciones # expresión regular (comparado con strsplit) ### Escribir frases condicionales # usar una frase lógica y condicional para dos muestras if(dee.df$dees[1] > dee.df$dees[2]){ cat("Glau 1 is greater than Glau 2") } else{ cat("Glau 1 is less than Glau 2") } ### Usar frases condicionales dentro de funciones (if(), else()) # frases condicionales son cómo una desvía para un tren # si la primera condición es verdad, la función continúa al código que sigue # si esa condición es falsa, la función salta a la próxima condición, hasta que # encuentra una condición verdad para seguir # calcular cuántas muestras tienen más dees que el promedio counts <- function(x) { count <- 0 for(n in 1:length(x)) { if(n >= mean(x)) count <- count + 1 # no se necesita {} para sólo una línea } return(count) } counts(dee.df$dees) # calcular cuántas muestras tienen más dees que el promedio, # pero sólo para el tamaño más pequeño de depradador counts <- function(x) { count <- 0 for(n in 1:length(x)) { if(n >= mean(x)) { if(dee.df$size[n] == "small") count <- count + 1 } } return(count) } counts(dee.df$dees) # calcular cuántas muestras tienen más dees que el promedio, y cuántas # tienen más dees que el promedio, pero sólo para el tamaño más pequeño de # depradador counts <- function(x) { less <- 0 gr8r <- 0 for(n in 1:length(x)) { if(dee.df$size[n] == "small"){ if(n <= mean(x)) less <- less + 1 else gr8r <- gr8r + 1 } } df <- data.frame(less, gr8r, row.names = NULL) return(df) } counts(dee.df$dees) ### Expresión regular # Esta manera de escribir código, enfocado en buscar patrones, es muy útil, # eficiente y general (más aplicable) # Unos símbolos o metacarácteres: # " + " significa que el digit se puede repetir más que una vez # " . " significa cualquier cosa (un wildcard) # " * " significa que el digit se puede repetir muchas veces, o ni una vez # "$" significa que no hay más carácteres del patrón # Estos símbolos se pueden usar en combinaciones para describir patrones # generales # Usar un carácter de escape, \, si está buscando un carácter que de hecho es # un metacarácter # pattern <- "\\." el patrón es "." # pattern <- "\\" # el patrón es "\" # pattern <- "\\^" # el patrón es "^" # Usar () para describir donde el patron debe ser dividido # Por ejemplo, uno puede extraer los nombres de especies de las grabaciones # que han bajado de Xeno Canto setwd(file.path(getwd(),"warbleR example")) files <- list.files(pattern = "wav$") # files <- files[-c(1:2)] # Primero hay que describir el patrón pattern <- "([A-Za-z]+)-([a-z]+)-([0-9]+)(.*)" # matched describe el patrón dentro del vector de interés # si el patrón no se encuentra dentro del vector, matched será -1 matched <- regexec(pattern, files) matched # values contiene los valores del vector dividido # suele tener varios valores: el patrón general y cualquier patrón especificado # dentro de los paréntesis values <- regmatches(files, matched) values # Ahora uno podría usar lapply() o sapply() con indexar para extraer genero y especie de varias grabaciones # usar grep() para acesar patrones específicos, o para indexar (parecido a which()) grep("-", files) grep("ii.20", files) # usar gsub() para reemplazar patrones específicos nms <- gsub("-", ".", files) nms # usar grepl() para indexar dee.df[grepl("Buteo", dee.df$genus), ] # usar grepl() dentro de frases condicionales buteo <- unlist(lapply(c(1:length(dee.df$genus)), function(x){ if(grepl("Buteo", dee.df$genus[x])){ y <- mean(dee.df$dees[x]) } else y <- NA return(y) })) buteo ### EJERCICIO FINAL: # Extraer información de genero y especie desde los nombres de grabaciones en # el directorio corriente, primero usando strsplit() y después usando expresión # regular (pueden usar una función en cada caso) setwd(file.path(getwd(),"warbleR example")) files <- list.files(pattern = "wav$")