2017-10-09 2 views
1

Je voudrais écrire une fonction simple qui utiliserait les quosures passées par ellipse dans l'appel mutate_at.Utilisation de quosures dans l'argument vars de mutate_at

# Packages 
sapply(
    X = c("dplyr", "rlang"), 
    FUN = require, 
    character.only = TRUE 
) 

# Data 
set.seed(1) 
cbind(as.data.frame(replicate(3, replicate(
    10, paste0(sample(letters, 5), collapse = "") 
))), c(1:10)) %>% setNames(nm = paste(replicate(4, "col"), LETTERS[1:4], sep = "_")) -> dta 


# Mutate 
mutate_some <- function(df, ...) { 
    mut_vars <- quos(...) 
    df %>% 
     mutate(.vars = !!!mut_vars, 
       .funs = funs(toupper(.))) 
} 

# test 
dta %>% mutate_some(col_A, col_C) 

Problème

Le code produit:

>> dta %>% mutate_some(col_A, col_C) 
    col_A col_B col_C col_D .vars1 .vars2  .funs 
1 gjnue mvkfb rigwn  1 gjnue rigwn ~toupper(.) 
2 xzpob chmpi fdlvn  2 xzpob fdlvn ~toupper(.) 
3 feqix xhlyo zsijd  3 feqix zsijd ~toupper(.) 
4 mrxiy glsbt arcko  4 mrxiy arcko ~toupper(.) 
5 yfpcz iuzhk zmldq  5 yfpcz zmldq ~toupper(.) 
6 kajuh xvjry lmefn  6 kajuh lmefn ~toupper(.) 
7 moles lrjhq obazu  7 moles obazu ~toupper(.) 
8 rtcqj frczd pomwl  8 rtcqj pomwl ~toupper(.) 
9 vqsml gbpur rpfxq  9 vqsml rpfxq ~toupper(.) 
10 ualqp uljsn lerct 10 ualqp lerct ~toupper(.) 

Résultats escomptés

Les résultats devraient être équivalents à:

dta %>% mutate_at(.funs = funs(toupper(.)), .vars = c("col_A", "col_C")) 
    col_A col_B col_C col_D 
1 GJNUE mvkfb RIGWN  1 
2 XZPOB chmpi FDLVN  2 
3 FEQIX xhlyo ZSIJD  3 
4 MRXIY glsbt ARCKO  4 
5 YFPCZ iuzhk ZMLDQ  5 
6 KAJUH xvjry LMEFN  6 
7 MOLES lrjhq OBAZU  7 
8 RTCQJ frczd POMWL  8 
9 VQSML gbpur RPFXQ  9 
10 UALQP uljsn LERCT 10 

Hypothèses:

  • La fonction mutate_some doit prendre l'argument de l'ellipse qui est lates utilisés dans mut_vars <- quos(...).

  • En particulier, je suis à la recherche d'une solution qui ressemblera à rlang::do_something_(mut_vars). Cette fonction fait partie d'un pipeline plus long et je dois garder mut_vars comme quos() car je l'utilise plus tard. Je ne veux pas changer les noms des colonnes (comme dans les résultats souhaités ci-dessus).

Répondre

1

Vous semblez être déjà au courant de la fonction mutate_at et je ne sais pas pourquoi vous ne l'utilisez pas dans votre mutate_some, mais il produit les résultats que vous voulez

mutate_some <- function(df, ...) { 
    mut_vars <- quos(...) 
    df %>% 
    mutate_at(mut_vars, 
      .funs = funs(toupper(.))) 
} 
+0

Merci, je n Je ne sais pas que je n'ai pas à casser les quosures et je peux juste passer 'mut_vars' sans **' !!! '** ou **' rlang :: (...) '**. Concernant votre question, l'exemple est synoptique. Dans mon pipeline actuel, j'ai d'autres opérations que j'applique fréquemment, il est donc logique de les envelopper dans une fonction commune. Naturellement, il n'y aurait aucun intérêt à intégrer 'mutate_at' dans' mutate_some' sans d'autres fonctions. – Konrad