ifelse() en R: crear columnas condicionales
ifelse() evalúa una condición y devuelve un valor si se cumple y otro si no. Es la forma habitual de crear columnas clasificatorias.
Ejemplo simple
notas <- c(3, 7, 5, 9, 4)
ifelse(notas >= 5, "aprobado", "suspenso")
Se lee tal cual: si la nota es 5 o más, "aprobado"; si no, "suspenso".
Lo importante es que trabaja sobre todo el vector a la vez, no valor a valor. No necesitas ningún bucle.
En un data frame
El uso real es crear una columna nueva a partir de otra:
ventas <- data.frame(
producto = c("A", "B", "C", "D"),
total = c(120, 340, 90, 500)
)
ventas$categoria <- ifelse(ventas$total > 200, "alto", "bajo")
Y ojo con el if normal: if funciona con una sola condición, no con vectores. Si le pasas un vector te dará error o solo evaluará el primer elemento. Para columnas, siempre ifelse().
Cuando hay más de dos casos
Se pueden anidar, pero se vuelve ilegible enseguida:
ventas$nivel <- ifelse(ventas$total > 300, "alto",
ifelse(ventas$total > 150, "medio", "bajo"))
Con tres o más tramos numéricos, cut() es mucho más limpio:
ventas$nivel <- cut(ventas$total,
breaks = c(-Inf, 150, 300, Inf),
labels = c("bajo", "medio", "alto"))
cut() parte un vector numérico en tramos y les pone etiqueta. Los -Inf e Inf de los extremos garantizan que ningún valor se quede fuera.
Ejemplo algo más completo
Cuidado con los NA: ifelse() los propaga, no los clasifica.
notas <- c(3, 7, NA, 9)
ifelse(notas >= 5, "aprobado", "suspenso")
El tercer elemento sale NA, no "suspenso". Si quieres tratarlos, decláralo:
ifelse(is.na(notas), "sin nota",
ifelse(notas >= 5, "aprobado", "suspenso"))
Poniendo la comprobación del NA primero, porque ifelse() evalúa en orden.