Pregunta Usar funciones de múltiples columnas en una llamada dplyr mutate_at


Me gustaría usar Dplyr's mutate_at función 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 un mutate_at llamada 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) 
                  )

El deseado mutate_at llamada sería similar a la siguiente llamada a 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 usando dplyr's mutate_at función en aras de la legibilidad, la interfaz con bases de datos, etc.

A continuación se incluyen algunas preguntas similares sobre stackoverflow que no haga abordar la pregunta que hice 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


32
2017-08-29 15:32


origen


Respuestas:


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(), al igual que:

temp_fn <- function(input) ifelse(test = df[["x"]],
                                  yes = input,
                                  no = NA)

df %>%
   mutate_at(.vars = vars(y, z),
             .funs = temp_fn)

38
2017-12-14 21:10



Para complementar la respuesta anterior, si quería mutate_at() para agregar nuevas variables (en lugar de reemplazar), con nombres como z_1 y y_1 como en la pregunta original, solo necesita agregar el nombre dentro del 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 más detalles y trucos, ver: Crea nuevas variables con mutate_at mientras mantienes las originales


0
2017-07-11 00:29