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.