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 valoresTRUE
detest
. -
no
: lo que se devuelve los valoresFALSE
detest
.
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 (&
) 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)