summarise_all mutate_all mutate all r dplyr

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