2017-08-17 1 views
3

Si je voulais exclure certaines colonnes (Ozone, Day, Month) qui obtiennent « réunis » Je peux faire cela:Hors plutôt que d'inclure recueillir variable en utilisant tidyr tidyeval

tidyr::gather(airquality, key, value, -Ozone, -Day, -Month)

Mais dans une fonction, il n'est pas clair pour moi comment faire cela. Cela semble maladroit si cela fonctionne:

my_gather <- function(col_to_compare) { 
    gather_cols = dplyr::setdiff(c("Ozone", "Solar.R","Wind","Temp"), col_to_compare) 
    tidyr::gather(airquality, key, value, !! rlang::enquo(gather_cols)) 
} 

my_gather("Ozone") 

Une idée comment exclure des colonnes d'une manière plus rigoureuse?

Note: Ceci est avec tidyr 0.7.0

+0

Voulez-vous une fonction qui utilise les noms de colonnes comme cordes? Si c'est le cas, vous pourriez trouver '-one_of (cols_to_compare)' utile. – aosmith

+0

Voulez-vous passer les colonnes comme quelque chose comme 'my_gather (Ozone)' plutôt que my_gather (-Ozone) '? Je pense que ce dernier est raisonnablement simple, le premier serait un peu plus compliqué. –

+0

aosmith a raison de dire que 'one_of()' est la solution ici. – lionel

Répondre

3

Depuis gather() a la même sémantique que select(), cette question est un double de Remove columns the tidyeval way.

Vous pouvez utiliser -one_of(vars), qui est la méthode recommandée pour ce faire.

Vous pouvez également créer une liste de symboles annulés et les regrouper dans l'appel gather(). Voici comment créer des symboles et les envelopper dans des appels à -:

# This creates a list of symbols 
syms <- syms(vars) 

# This creates a list of calls: 
exprs <- map(syms, function(sym) lang("-", sym)) 

Vous pouvez ensuite raccorder la liste des appels avec !!!:

df %>% gather(key, value, !!! exprs)