66 votes

Utilisation des fonctions de plusieurs colonnes dans un appel dplyr mutate_at

Je voudrais utiliser dplyr de l' mutate_at fonction à appliquer une fonction à plusieurs colonnes dans un dataframe, où la fonction des entrées de la colonne à laquelle elle est directement appliquée, ainsi qu'une autre colonne d'un dataframe.

À titre d'exemple concret, j'aurais l'air de la mutation de l'suivantes dataframe

# Example input dataframe
df <- data_frame(x = c(TRUE, TRUE, FALSE),
                 y = c("Hello", "Hola", "Ciao"),
                 z = c("World", "ao", "HaOlam")
                 )

avec un mutate_at appel qui ressemble à ceci

df %>%
mutate_at(.vars = vars(y, z),
          .funs = ifelse(x, ., NA)
          )

de retour d'un dataframe qui ressemble à quelque chose comme ceci

# Desired output dataframe
df2 <- data_frame(x = c(TRUE, TRUE, FALSE),
                  y_1 = c("Hello", "Hola", NA),
                  z_1 = c("World", "ao", NA) 
                  )

L'souhaité mutate_at appel serait semblable à l'issue d'un appel d' mutate:

df %>%
   mutate(y_1 = ifelse(x, y, NA),
          z_1 = ifelse(x, z, NA)
          )

Je sais que cela peut être fait dans la base de R de plusieurs façons, mais je tiens tout particulièrement à atteindre cet objectif en utilisant dplyr de l' mutate_at fonction pour des raisons de lisibilité, l'interfaçage avec les bases de données, etc.

Ci-dessous sont certaines des questions similaires posées sur stackoverflow qui ne pas répondre à la question que j'ai posée ici:

ajout de plusieurs colonnes dans une dplyr muter appel

dplyr::muter pour ajouter plusieurs valeurs

L'utilisation de la colonne à l'intérieur de fonction sum() à l'aide de dplyr de muter() la fonction

73voto

bschneidr Points 1467

@ Eipi10 a répondu à cela dans le commentaire de @ eipi10 sur la question, mais je l'écris ici pour la postérité.

La solution ici est d'utiliser:

 df %>%
   mutate_at(.vars = vars(y, z),
             .funs = funs(ifelse(x, ., NA)))
 

L'utilisation de funs() ici indique que ifelse(x, ., NA) est une fonction anonyme définie dans l'appel à mutate_at() .

Cela fonctionne de manière similaire à la définition de la fonction en dehors de l'appel à mutate_at() , comme ceci:

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

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

19voto

user23239 Points 151

Pour compléter la réponse précédente, si vous vouliez mutate_at() d'ajouter de nouvelles variables (au lieu de la remplacer), avec des noms tels que z_1 et y_1 comme dans la question d'origine, il vous suffit d'ajouter le nom dans l' funs(newname= ...) appel:

df %>%
  mutate_at(.vars = vars(y, z),
            .funs = funs(`1`=ifelse(x, ., NA)))

Cela donne:

# 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   

Pour plus de détails et d'astuces, voir: Créer de nouvelles variables avec mutate_at tout en gardant les originaux

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X