2017-07-27 4 views
5

Je ne trouve pas dans dplyr 0.7 une façon de remplacer la fonction mutate_ qui va être dépréciée. La fonction mutate_ est utile dans mon cas d'utilisation: je stocke dans une base de données (format chaîne) de nombreuses instructions (qui peuvent être filtrées si nécessaire) et applique ces instructions à une ou plusieurs trames de données.dplyr 0.7 équivalent pour mutate obsolète

Par exemple:

dplyr::tibble(test = "[email protected]") %>% 
    dplyr::mutate_(.dots = list("test2" = "substr(test, 1, 5)", 
           "test3" = "substr(test, 5, 5)")) 

Est-il possible de le faire avec dplyr 0,7 variables et des instructions de tenue que le caractère?

+0

Le doc '? États mutate_' « dplyr utilise désormais la sémantique d'évaluation bien rangé », se référant à l'ensemble de rlang qui a une vignette sur « l'évaluation ordonnée ». Bonne chance si vous suivez cette route. – Frank

Répondre

6

Pour développer un peu sur l » exemple MrFlick, supposons que vous avez un certain nombre d'instructions stockées sous forme de chaînes, ainsi que les noms correspondants que vous souhaitez attribuer aux calculs résultants:

ln <- list("test2", "test3") 
lf <- list("substr(test, 1, 5)", "substr(test, 5, 5)") 

Faites correspondre des noms à leurs instructions et convertir tout en quosures:

ll <- setNames(lf, ln) %>% lapply(rlang::parse_quosure) 

Selon la suggestion de aosmith, la liste entière peut maintenant être transmis à muter, en utilisant l'opérateur !!! spécial:

tibble(test = "[email protected]") %>% mutate(!!! ll) 
# # A tibble: 1 x 3 
#  test test2 test3 
#  <chr> <chr> <chr> 
# 1 [email protected] [email protected]  @ 
+1

Vous pouvez également faire 'mutate (X, !!! ll)' à la place de l'étape 'do.call' complète. – aosmith

+0

Excellente idée, aosmith. Je vais mettre à jour la réponse. Merci. –

+0

Merci beaucoup MrFlick, Artem et aosmith! – stephLH

3

est ici sur autre

a <- "test2" 
b <- "test3" 
dplyr::tibble(test = "[email protected]") %>% 
dplyr::mutate(a := !!rlang::parse_quosure("substr(test, 1, 5)"), 
    b := !!rlang::parse_quosure("substr(test, 5, 5)")) 
# # A tibble: 1 x 3 
#  test  a  b 
#  <chr> <chr> <chr> 
# 1 [email protected] [email protected]  @ 

Nous utilisons l'opérateur := pour nommer dynamiquement les paramètres avec les chaînes, et nous analyser la chaîne d'expression pour la transformation et déballez avec « !! »