La función mutate() en R: crear columnas nuevas (y hacerlo sin dplyr)

mutate() añade columnas calculadas a partir de las que ya tienes. Es de dplyr:

install.packages("dplyr")
library(dplyr)

Este es quizá el caso donde R base gana más claramente, porque hacerlo sin librerías es incluso más corto.

Ejemplo simple

library(dplyr)

ventas <- data.frame(
  producto = c("A", "B", "C"),
  unidades = c(10, 5, 8),
  precio = c(20, 50, 35)
)

mutate(ventas, total = unidades * precio)

Se crea la columna total multiplicando las otras dos.

Ojo con algo importante: esto no modifica ventas, devuelve una copia. Si quieres conservar el cambio, tienes que reasignar:

ventas <- mutate(ventas, total = unidades * precio)

Lo mismo en R base

Con el símbolo del dólar y una asignación:

ventas$total <- ventas$unidades * ventas$precio

Una línea, sin librerías, y modifica el objeto directamente. Difícil de mejorar.

Para varias columnas, una línea cada una:

ventas$total <- ventas$unidades * ventas$precio
ventas$iva <- ventas$total * 0.21
ventas$total_con_iva <- ventas$total + ventas$iva

En dplyr todo eso iría dentro de un solo mutate(), lo cual es más compacto pero tampoco cambia la vida.

Ejemplo algo más completo: columnas condicionales

Crear una columna según una condición se resuelve con ifelse(), que está en R base y funciona igual en los dos mundos:

ventas$categoria <- ifelse(ventas$total > 200, "alto", "bajo")

Lee así: si la condición se cumple, pon "alto"; si no, "bajo".

Cuando hay más de dos casos, se pueden anidar, aunque se vuelve ilegible enseguida:

ventas$nivel <- ifelse(ventas$total > 300, "alto",
                ifelse(ventas$total > 150, "medio", "bajo"))

Con tres o más niveles, es más limpio usar cut():

ventas$nivel <- cut(ventas$total,
                    breaks = c(-Inf, 150, 300, Inf),
                    labels = c("bajo", "medio", "alto"))

cut() corta un vector numérico en tramos y les pone etiqueta. Los -Inf e Inf de los extremos aseguran que ningún valor se quede fuera.

Nuestra recomendación: para crear columnas, datos$nueva <- ... de R base es más corto que mutate() y no depende de nada. Guárdate dplyr para cuando de verdad encadenes muchas transformaciones seguidas.