2017-08-15 3 views
3

J'essaye d'écrire une fonction qui prend comme un de ses arguments un vecteur de noms de colonne de l'utilisateur. Les noms de colonne seront utilisés pour spécifier quelles colonnes de l'ensemble de données seront collées ensemble pour former une nouvelle colonne dans dplyr :: mutate. J'ai d'abord essayé de replier les éléments du vecteur d'argument puis d'utiliser la chaîne repliée dans mutate - c'est faux. Voir cette dernière tentative ci-dessous. J'ai fait d'autres tentatives mais je ne comprends pas le nouveau quo, enquo, UQ, !!!, !!, et ainsi de suite au sein de dplyr. Quelqu'un peut-il montrer ce que j'ai besoin de faire?Passer le vecteur des noms de colonne à paste() dans mutate (dplyr)

df <- data.frame(.yr = c("2000", "2001", "2002"), .mo = c("12", "01", "02"), .other = rnorm(3)) 
cols <- colnames(df)[1:2] 

do_want <- df %>% 
    mutate(new = paste(.yr, .mo, sep = "-")) 

my_func <- function(dat, vars){ 
    .vars <- paste(vars, collapse = ",") 

    result <- dat %>% 
    mutate(new = paste(.vars, sep = "-")) 
    return(result) 
} 

my_func(dat = df, vars = cols) 

edit: ceci est ma tentative d'utiliser quo et !! dans la définition de la fonction. le résultat est une colonne de chaîne répétée ".an, .mo"

my_func <- function(dat, vars){ 
    .vars <- quo(paste(vars, collapse = ",")) 

    result <- dat %>% 
    mutate(new = paste(!!.vars, sep = "-")) 
    return(result) 
} 

Répondre

3

Parce que vous avez une liste des chaînes, vous pouvez utiliser rlang::syms dans votre fonction pour prendre les chaînes et les transformer en symboles. Ensuite, vous pouvez utiliser !!! pour fusionner les arguments ensemble pour mettre en paste.

my_func <- function(dat, vars){ 
    .vars <- rlang::syms(vars) 

    result <- dat %>% 
      mutate(new = paste(!!!.vars, sep = "-")) 
    return(result) 
} 

my_func(dat = df, vars = cols) 

    .yr .mo  .other  new 
1 2000 12 -0.2663456 2000-12 
2 2001 01 0.5463433 2001-01 
3 2002 02 -1.3133078 2002-02 
0

Utilisation mutate_ au lieu de mutate & transformer l'expression en une chaîne a fonctionné pour moi:

dplyr_solution <- function(dat, vars){ 
    .vars <- paste(vars, collapse = ",") 

    result <- dat %>% 
    mutate_(new = paste0('paste(', .vars, ', sep="-")')) 
    return(result) 
} 

dplyr_solution(dat = df, vars = cols) 
+0

Merci - J'ai fait une tentative comme celle-ci mais je n'ai pas enveloppé la pâte intérieure entre guillemets. Cela fonctionne, espérant toujours que quelqu'un puisse montrer une solution qui utilise la nouvelle fonctionnalité rLang qui rend mutate_ superflu et est plus élégant que 3 pâtes imbriquées. – mb158127

+1

'mutate_' et similaires sont obsolètes dans dplyr maintenant. –