1
votes

Passer les variables par nom dans une fonction qui appelle dplyr?

J'essaie de créer une fonction qui prendra 2 variables d'un ensemble de données, et mappera leurs valeurs distinctes côte à côte, après quoi il écrira le dans un fichier csv. J'utiliserai la fonction distincte de dplyr pour obtenir les valeurs uniques.

map_table <- function(df, var1, var2){
  df_distinct <- df %>% distinct(var1, var2)
  write.csv(df_distinct, 'var1.csv')
}

map_table(iris, Species, Petal.Width)

1) map_table (iris, Species, Petal.Width) ne produit pas ce que je veux. Il devrait produire 27 lignes de données, à la place j'obtiens 150 lignes de données.

2) Comment puis-je nommer le fichier csv après l'entrée de var1? Donc, si var1 = 'Sepal.Length', le nom du fichier doit être 'Sepal.Length.csv'


1 commentaires

l'évaluation non standard (NSE) est un problème bien connu lors de l'utilisation de < code> dplyr . Voici [une question connexe datant de 2014] (comment puis-je dire à select () dans dplyr que la chaîne qu'il voit est un nom de colonne dans un bloc de données); mais la solution ici est plus propre, donc cela ne devrait probablement pas être fermé en tant que duplicata.


3 Réponses :


0
votes

Vous essayez de transmettre les colonnes en tant qu'objets. Essayez plutôt de transmettre leurs noms, puis utilisez un assistant de sélection:

map_table <- function(df, var1, var2){
  df_distinct <- df %>% select(one_of(c(var1, var2)))%>%
      distinct()
  write.csv(df_distinct, 'var1.csv')
}

map_table(iris, 'Species', 'Petal.Width')


0 commentaires

0
votes

1) Ok, la réponse est d'utiliser distinct_ au lieu de distinct. Et les variables appelées doivent être apostrophisées. 2) utilisez la fonction apply pour concaténer les valeurs / le formatage de la chaîne, et file =

map_table <- function(df, var1, var2){
  df_distinct <- df %>% distinct_(var1, var2)
  write.csv(df_distinct, file = paste(var1,'.csv'))
}

map_table(iris, 'Species', 'Petal.Width')


1 commentaires

Il existe également une solution sans les guillemets dans l'appel de fonction.



2
votes

Si vous souhaitez transmettre les noms de colonnes sans guillemets, vous devez utiliser évaluation non standard . (Plus d'informations ici )

deparse (substitute ()) code> vous donnera le nom du fichier de sortie.

library(dplyr)

map_table <- function(df, var1, var2){

  file_name <- paste0(deparse(substitute(var1)), ".csv") # file name

  var1 <- enquo(var1) # non-standard eval
  var2 <- enquo(var2) # equo() caputures the expression passed, ie: Species

  df_distinct <- df %>% 
    distinct(!!var1, !!var2) # non-standard eval, !! tells dplyr to use Species

  write.csv(df_distinct, file = file_name)

}

map_table(iris, Species, Petal.Width)


0 commentaires