Crear y modificar columnas en R con la función mutate() de dplyr

Crear y modificar columnas en R con la función mutate() de dplyr

La función mutate del paquete dplyr se utiliza para crear nuevas columnas o modificar columnas existentes en un data frame, manteniendo la estructura original. Permite aplicar funciones u operaciones a los datos de un data frame y almacenar los resultados como nuevas variables.

Sintaxis

La sintaxis de la función mutate es la siguiente:

# Uso básico
mutate(.data, nuevo_nombre_columna = expresion)


mutate(
  .data,  # Conjunto de datos
  ...,    # Nuevas columnas (nuevo_nombre_columna = expresion)
  .by = NULL, # Agrupar por estas variables
  .keep = c("all", "used", "unused", "none"), # Columnas que mantener
  .before = NULL, # Las nuevas columnas aparecerán antes de esta
  .after = NULL   # Las nuevas columnas aparecerán después de esta
)

Crear columnas

Para crear una nueva columna puedes especificar el nombre de la nueva columna (Var3) y una expresión para calcular los valores de la nueva columna. En el ejemplo siguiente, la expresión es la suma de otras dos columnas (Var1 + Var2).

library(dplyr)

set.seed(8)
df <- data.frame(Var1 = sample(1:50, 5), Var2 = sample(1:50, 5))

# Nueva columna con la suma de 'Var1' y 'Var2'
df_2 <- df %>%
  mutate(Var3 = Var1 + Var2)

df_2
  Var1 Var2 Var3
1   32   39   71
2   34    1   35
3   15   29   44
4   12    3   15
5   42   35   77

La función mutate() de dplyr

También puedes aplicar una función a una columna para crear una nueva. El siguiente ejemplo ilustra cómo crear una nueva columna con la raíz cuadrada de otra.

library(dplyr)

set.seed(8)
df <- data.frame(Var1 = sample(1:50, 5), Var2 = sample(1:50, 5))

# Nueva columna con la raíz cuadrada de 'Var1'
df_2 <- df %>%
  mutate(Sqrt_Var1 = sqrt(Var1))

df_2
  Var1 Var2 Sqrt_Var1
1   32   39  5.656854
2   34    1  5.830952
3   15   29  3.872983
4   12    3  3.464102
5   42   35  6.480741

Crear nuevas columnas en R usando dplyr

Agregar varias columnas nuevas a la vez

Ten en cuenta que puedes añadir varias columnas simultáneamente pasando más expresiones separadas por comas a mutate.

library(dplyr)

set.seed(8)
df <- data.frame(Var1 = sample(1:50, 5), Var2 = sample(1:50, 5))

# Crear tres nuevas columnas llamadas 'Var3', 'Var4' y 'Var5'
df_2 <- df %>%
  mutate(Var3 = Var1 + Var2,
         Var4 = cumsum(Var1),
         Var5 = ifelse(Var1 > Var2, TRUE, FALSE))

df_2
  Var1 Var2 Var3 Var4  Var5
1   32   39   71   32 FALSE
2   34    1   35   66  TRUE
3   15   29   44   81 FALSE
4   12    3   15   93  TRUE
5   42   35   77  135  TRUE

Agregar varias columnas a la vez en R con la función mutate de dplyr

Usando across

La función across permite seleccionar columnas específicas con funciones de selección mientras se utiliza mutate.

En el siguiente ejemplo, la función sqrt se aplica a todas las columnas que contienen "1" en sus nombres. A continuación, las nuevas columnas reciben el nombre de la columna anterior ("{.col}") seguido de un sufijo ("_sqrt").

library(dplyr)

set.seed(8)
df <- data.frame(Var1 = sample(1:50, 5), Var2 = sample(1:50, 5))

# Crear nuevas columnas con todas las columnas que contienen "1" en sus nombres
df_2 <- df %>%
  mutate(across(contains("1"), sqrt, .names = "{.col}_sqrt"))

df_2
  Var1 Var2 Var1_sqrt
1   32   39  5.656854
2   34    1  5.830952
3   15   29  3.872983
4   12    3  3.464102
5   42   35  6.480741

Las funciones mutate() y across() de dplyr

Modificar columnas existentes

La función mutate también es capaz de modificar columnas existentes. Para ello, basta con utilizar la sintaxis nombre_columna_antigua = expresion

library(dplyr)

set.seed(8)
df <- data.frame(Var1 = sample(1:50, 5), Var2 = sample(1:50, 5))

# Modifica 'Var1' como su valor dividido por la media de la columna
df_2 <- df %>%
  mutate(Var1 = Var1 / mean(Var1, na.rm = TRUE)) 

df_2
       Var1 Var2
1 1.1851852   39
2 1.2592593    1
3 0.5555556   29
4 0.4444444    3
5 1.5555556   35

Modificar varias columnas

Con across puedes seleccionar columnas específicas y aplicarles una función personalizada sin crear nuevas columnas. El siguiente ejemplo muestra cómo aplicar la función log a todas las columnas excepto a Var1.

library(dplyr)

set.seed(8)
df <- data.frame(Var1 = sample(1:50, 5), Var2 = sample(1:50, 5))

# Aplicar la función log a todas las columnas menos a 'Var1'
df_2 <- df %>%
  mutate(across(!Var1, log)) 

df_2
  Var1     Var2
1   32 3.663562
2   34 0.000000
3   15 3.367296
4   12 1.098612
5   42 3.555348

Modificar columnas con la función mutate de dplyr

En los casos en los que la función deseada tome argumentos adicionales, deberás utilizar ~ antes de la función y . para representar los valores de las columnas.

library(dplyr)

set.seed(8)
df <- data.frame(Var1 = sample(1:50, 5), Var2 = sample(1:50, 5))

# Modificar todas las columnas menos 'Var1' con paste0
df_2 <- df %>%
  mutate(across(!Var1, ~paste0("Value: ", .))) 

df_2
  Var1      Var2
1   32 Value: 39
2   34  Value: 1
3   15 Value: 29
4   12  Value: 3
5   42 Value: 35

Modificar las columnas seleccionadas aplicando una función en dplyr

Posición de las nuevas columnas

Por defecto, cuando se utiliza mutate para crear una nueva columna, ésta se añade al final del data frame. No obstante, la función mutate permite utilizar los argumentos .before o .after para controlar la posición de las nuevas columnas respecto a otras.

En el ejemplo siguiente, se añade una nueva columna antes de Var2:

library(dplyr)

set.seed(8)
df <- data.frame(Var1 = sample(1:50, 5), Var2 = sample(1:50, 5))

# New column before 'Var2'
df_2 <- df %>%
  mutate(Var3 = Var1 / Var2, .before = Var2)

df_2
  Var1       Var3 Var2
1   32  0.8205128   39
2   34 34.0000000    1
3   15  0.5172414   29
4   12  4.0000000    3
5   42  1.2000000   35

Añadir una nueva columna antes que otra en dplyr

Además, puedes especificar posiciones basadas en el índice de la columna. Por ejemplo, establecer .before = 1 añadirá la nueva columna como la primera columna.

library(dplyr)

set.seed(8)
df <- data.frame(Var1 = sample(1:50, 5), Var2 = sample(1:50, 5))

# Nueva columna en la primera posición (antes de la primera columna)
df_2 <- df %>%
  mutate(Var3 = Var1 / Var2, .before = 1)

df_2
        Var3 Var1 Var2
1  0.8205128   32   39
2 34.0000000   34    1
3  0.5172414   15   29
4  4.0000000   12    3
5  1.2000000   42   35

Añadir una nueva columna en una posición específica con dplyr

En el ejemplo siguiente, si se establece .after = "Var2", la nueva columna se situará después de Var2.

library(dplyr)

set.seed(8)
df <- data.frame(Var1 = sample(1:50, 5), Var2 = sample(1:50, 5))

# Nueva columna después de 'Var2'
df_2 <- df %>%
  mutate(Var3 = Var1 * Var2, .after = "Var2")

df_2
  Var1 Var2 Var3
1   32   39 1248
2   34    1   34
3   15   29  435
4   12    3   36
5   42   35 1470

Añadir una nueva columna después de otra columna en dplyr

Mantener o eliminar columnas con keep

Cuando se añaden nuevas columnas a un data frame, todas las demás columnas se mantendrán por defecto. Sin embargo, el argumento .keep, que por defecto es "all", también puede establecerse a "used" para conservar sólo las columnas utilizadas dentro de mutate, a "unused" para conservar las columnas no utilizadas y a "none" para borrar todas las columnas antiguas.

El siguiente ejemplo muestra cómo utilizar .keep manteniendo sólo las columnas utilizadas.

library(dplyr)

set.seed(8)
df <- data.frame(Var1 = sample(1:50, 5), Var2 = sample(1:50, 5))

# Nueva columna y mantener la nueva columna ('Var3') y la columna utilizada ('Var1')
df_2 <- df %>%
  mutate(Var3 = Var1 * 2, .keep = "used")

df_2
  Var1 Var3
1   32   64
2   34   68
3   15   30
4   12   24
5   42   84

Agrega nuevas columnas en R con la función mutate() y conserva las columnas usadas

Lo contrario es mantener sólo la nueva columna y las columnas que no se han utilizado estableciendo .keep = "unused".

library(dplyr)

set.seed(8)
df <- data.frame(Var1 = sample(1:50, 5), Var2 = sample(1:50, 5))

# Nueva columna y mantener la nueva columna ('Var3') y la columna no utilizada ('Var2')
df_2 <- df %>%
  mutate(Var3 = Var1 * 2, .keep = "unused")

df_2
  Var2 Var3
1   39   64
2    1   68
3   29   30
4    3   24
5   35   84

Añade nuevas columnas con la función mutate de dplyr y conserva las columnas no utilizadas

Por último, para eliminar todas las columnas del data frame original, utiliza .keep = "none".

library(dplyr)

set.seed(8)
df <- data.frame(Var1 = sample(1:50, 5), Var2 = sample(1:50, 5))

# Nueva columna y sólo mantener la nueva columna ('Var3')
df_2 <- df %>%
  mutate(Var3 = Var1 * 2, .keep = "none")

df_2
  Var3
1   64
2   68
3   30
4   24
5   84

Crear una nueva columna con dplyr y eliminar las demás