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'
3 Réponses :
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')
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')
Il existe également une solution sans les guillemets dans l'appel de fonction.
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)
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.