Escribir una función vectorizada en R
He escrito la siguiente función:
asteriks = function(pvalue){
if(pvalue > 0.05){
output = "NS"
}else if (pvalue <= 0.05 && pvalue > 0.01){
output = "*"
}else if (pvalue <= 0.01 && pvalue > 0.001){
output = "**"
}else if (pvalue <= 0.001 && pvalue > 0.0001){
output = "***"
}else if (pvalue <= 0.0001){
output = "****"
}
return(output)
}
Funciona bien cuando proporciono un argumento de longitud 1, pero me gustaría que la función tome un vector de longitud >1 como entrada y devuelva un vector de la misma longitud.
Ejemplo de lo que me gustaría hacer:
vector_pvals = c(0.1, 0.05, 0.001, 0.0001)
asteriks(vector_pvals)
El resultado debería ser un vector de caracteres como este:
[1] "NS" "*" "***" "****"
Puedo lograr esto usando la función en un bucle for
, por supuesto, pero en realidad quiero usarlo dentro de una tubería dplyr
, por lo que sería bueno poder alimentarle todo un vector. ¿La respuesta es usar un bucle for
dentro de la función para trabajar en cada elemento uno a la vez, o hay una forma más fácil?
davy.ai
Sí, una posible solución es utilizar la función
sapply
para aplicar la funciónasteriks
a cada elemento del vector de entrada y devolver un vector de la misma longitud. Aquí hay un código de ejemplo:La función
sapply
toma dos argumentos: el vector de entrada al que se le aplicará la función y la función a aplicar. Devuelve un vector de la misma longitud que el vector de entrada, donde cada elemento es el resultado de la función aplicada al elemento correspondiente del vector de entrada. De esta manera, podemos evitar el uso de un buclefor
dentro o fuera de la función y aún así lograr el resultado deseado.