mutate_all - Usar funciones de mĂșltiples columnas en una llamada dplyr mutate_at
r summarise_all (2)
Me gustaría utilizar la función mutate_at de mutate_at
para aplicar una función a varias columnas en un marco de datos, donde la función ingresa la columna a la que se aplica directamente, así como otra columna en el marco de datos.
Como ejemplo concreto, buscaría mutar el siguiente marco de datos
# Example input dataframe
df <- data_frame(x = c(TRUE, TRUE, FALSE),
y = c("Hello", "Hola", "Ciao"),
z = c("World", "ao", "HaOlam")
)
con una llamada mutate_at
que se parece a esto
df %>%
mutate_at(.vars = vars(y, z),
.funs = ifelse(x, ., NA)
)
para devolver un marco de datos que se parece a esto
# Desired output dataframe
df2 <- data_frame(x = c(TRUE, TRUE, FALSE),
y_1 = c("Hello", "Hola", NA),
z_1 = c("World", "ao", NA)
)
La llamada mutate_at
deseada sería similar a la siguiente llamada para mutate
:
df %>%
mutate(y_1 = ifelse(x, y, NA),
z_1 = ifelse(x, z, NA)
)
Sé que esto se puede hacer en la base R de varias maneras, pero específicamente me gustaría lograr este objetivo utilizando la función mutate_at de mutate_at
por el bien de la legibilidad, la interfaz con las bases de datos, etc.
A continuación se encuentran algunas preguntas similares formuladas en stackoverflow que no abordan la pregunta que planteé aquí:
agregar múltiples columnas en una llamada de mutación dplyr
dplyr :: mutate para agregar valores múltiples
Uso de la columna dentro de la función sum () usando la función mutate () de dplyr
Esto fue respondido por @ eipi10 en el comentario de @eipi10 sobre la pregunta, pero lo escribo aquí para la posteridad.
La solución aquí es usar:
df %>%
mutate_at(.vars = vars(y, z),
.funs = funs(ifelse(x, ., NA)))
El uso de funs()
aquí indica que ifelse(x, ., NA)
es una función anónima que se está definiendo dentro de la llamada a mutate_at()
.
Esto funciona de manera similar a definir la función fuera de la llamada a mutate_at()
, así:
temp_fn <- function(input) ifelse(test = df[["x"]],
yes = input,
no = NA)
df %>%
mutate_at(.vars = vars(y, z),
.funs = temp_fn)
Para complementar la respuesta anterior, si desea que mutate_at()
agregue nuevas variables (en lugar de reemplazar), con nombres como z_1
e y_1
como en la pregunta original, solo necesita agregar el nombre dentro de los funs(newname= ...)
llamada:
df %>%
mutate_at(.vars = vars(y, z),
.funs = funs(`1`=ifelse(x, ., NA)))
Esto da:
# A tibble: 3 x 5
x y z y_1 z_1
<lgl> <chr> <chr> <chr> <chr>
1 TRUE Hello World Hello World
2 TRUE Hola ao Hola ao
3 FALSE Ciao HaOlam NA NA
Para obtener más detalles y trucos, consulte: Crear nuevas variables con mutate_at mientras se mantienen las originales