es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, una posible solución es utilizar la función sapply para aplicar la función asteriks a cada elemento del vector de entrada y devolver un vector de la misma longitud. Aquí hay un código de ejemplo:

    vector_pvals <- c(0.1, 0.05, 0.001, 0.0001)
    
    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)
    }
    
    output <- sapply(vector_pvals, asteriks)
    output
    

    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 bucle for dentro o fuera de la función y aún así lograr el resultado deseado.

Comments are closed.