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.