La función ifelse en R

Introducción a R Estructuras de control
Aprende a utilizar la función ifelse en R

La función ifelse es una función vectorizada que permite aplicar una condición a cada elemento de un vector y devolver un nuevo vector con los resultados basados en la evaluación de dicha condición. Es útil cuando se trabaja con vectores o columnas de un dataframe y se desea aplicar una operación condicional elemento a elemento de forma eficiente.

Sintaxis de la función ifelse

La función ifelse evalúa una expresión y devuelve los valores especificados en el argumento yes para los elementos que son TRUE, y los valores especificados en el argumento no para los elementos que son FALSE. La sintaxis de la función es la siguiente:

ifelse(test, yes, no)

Siendo:

  • test: la expresión a evaluar, por lo general una comparación lógica.
  • yes: lo que se devuelve para los valores TRUE de test.
  • no: lo que se devuelve los valores FALSE de test.

La función ifelse se utiliza para aplicar condiciones a cada elemento de un vector, devolviendo un nuevo vector con resultados basados en la evaluación de la condición, mientras que la sentencia if else es una estructura de control condicional que ejecuta diferentes bloques de código dependiendo del resultado de una única condición.

Uso y ejemplos

Considera que quieres evaluar si un valor es mayor que un número específico. Para ello, tendrás que introducir tu condición dentro del argumento test. La función devolverá el primer elemento si la condición es TRUE, y el segundo elemento si es FALSE:

# Valor de la muestra
value <- 2

# Si el valor es mayor que 4 devuelve el primer elemento o el segundo en caso contrario
res <- ifelse(value > 4, "El valor es mayor que 4", "El valor es menor o igual a 4")

# Output
res
"El valor es menor o igual a 4"

Como la función ifelse está vectorizada, es posible aplicar la condición a un vector, por lo que la salida se basará en cada uno de los elementos. Así, en el siguiente ejemplo la condición se aplica a cada uno de los elementos del vector, y la salida se proporciona para cada uno de esos elementos.

# Vector muestra
valores <- c(2, 5, 6, 1)

# Para cada elemento devuelve TRUE si el valor es mayor que 4 o FALSE en caso contrario
res <- ifelse(valores > 4, TRUE, FALSE)

# Output
res
FALSE  TRUE  TRUE FALSE

ifelse con múltiples condiciones

Es importante tener en cuenta que puedes crear expresiones con múltiples condiciones OR (|) o AND (&amp;) utilizando la función ifelse en R. Estos operadores permiten construir expresiones lógicas complejas para manejar varias condiciones y tomar decisiones basadas en ellas.

# Vector muestra
x <- c("A", "C", "B")

# ifelse con varias condiciones
res<- ifelse(x == "C" | x == "A", "Grupo 1", "Grupo 2")

# Output
res
"Grupo 1" "Grupo 1" "Grupo 2"

Añadir una nueva columna a un data frame con ifelse

Dado un data frame en R, puedes crear o modificar una columna aplicando la función ifelse a los valores dentro de una o varias columnas, lo que te permitirá evaluar una condición para cada elemento en la(s) columna(s) especificada(s) y asignar los valores correspondientes en función de si la condición se cumple o no.

# Datos de muestra frame
df <- data.frame(x = c(5, 2, 3), y = c(4, 1, 4))

# Crear una nueva columna con ifelse
df$grupo <- ifelse(df$x > 3 & df$y > 2, "A", "B")

# Output
df
  x y grupo
1 5 4     A
2 2 1     B
3 3 4     B

ifelse anidado

Anidar varios ifelse permite aplicar múltiples sentencias condicionales de forma anidada, donde el resultado de una función ifelse sirve de entrada para otra función ifelse. Esto permite crear estructuras de decisión más complejas.

x <- c(10, -1, -4)

# Sentencias ifelse anidadas
res <- ifelse(x > 0, "G1", ifelse(x > -2, "G2", "G3"))

# Output
res
"G1" "G2" "G3"

Un caso de uso real puede ser convertir puntuaciones en notas, como en el bloque de código siguiente:

# Puntuaciones de ejemplo
puntuacion <- c(85, 92, 78, 65, 45, 97)

# Usando ifelse para asignar notas
notas <- ifelse(puntuacion >= 90, "A",
                 ifelse(puntuacion >= 80, "B",
                        ifelse(puntuacion >= 70, "C",
                               ifelse(puntuacion >= 60, "D", "F"))))
notas
"B" "A" "C" "D" "F" "A"

La legibilidad y mantenibilidad de tu código pueden verse comprometidas si anidas demasiadas sentencias ifelse. Considera separar la lógica en partes o utilizar alternativas como la función switch cuando sea posible.

R version 4.3.2 (2023-10-31 ucrt)