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 dansmut_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 gardermut_vars
commequos()
car je l'utilise plus tard. Je ne veux pas changer les noms des colonnes (comme dans les résultats souhaités ci-dessus).
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