R dplyr: renommer les variables en utilisant des fonctions de chaîne

(Question quelque peu connexe: entrez les nouveaux noms de colonnes sous forme de chaîne dans la fonction de renommage de dplyr )

Au milieu d’une chaîne de caractères dplyr ( %>% ), je voudrais remplacer plusieurs noms de colonnes par des fonctions de leurs anciens noms (en utilisant tolower ou gsub , etc.)

 library(tidyr); library(dplyr) data(iris) # This is what I want to do, but I'd like to use dplyr syntax names(iris) % gather(measurement, value, -species) %>% group_by(species,measurement) %>% summarise(avg_value = mean(value)) 

Je vois ?rename prend l’argument replace comme un named character vector, with new names as values, and old names as names.

J’ai donc essayé:

 iris %>% rename(replace=c(names(iris)=tolower( gsub("\\.", "_", names(iris) ) ) )) 

mais ceci (a) renvoie une Error: unexpected '=' in iris %>% ... et (b) nécessite le référencement par nom du bloc de données de l’opération précédente dans la chaîne, ce qui dans mon cas réel je ne pouvais pas faire .

 iris %>% rename(replace=c( )) %>% # ideally the fix would go here gather(measurement, value, -species) %>% group_by(species,measurement) %>% summarise(avg_value = mean(value)) # I realize I could mutate down here # instead, once the column names turn into values, # but that's not the point # ---- Desired output looks like: ------- # Source: local data frame [12 x 3] # Groups: species # # species measurement avg_value # 1 setosa sepal_length 5.006 # 2 setosa sepal_width 3.428 # 3 setosa petal_length 1.462 # 4 setosa petal_width 0.246 # 5 versicolor sepal_length 5.936 # 6 versicolor sepal_width 2.770 # ... etc .... 

Je pense que vous regardez la documentation de plyr::rename , pas dplyr::rename . Tu ferais quelque chose comme ça avec dplyr::rename :

 iris %>% rename_(.dots=setNames(names(.), tolower(gsub("\\.", "_", names(.))))) 

Ceci est une réponse très tardive, en mai 2017

A partir de dplyr 0.5.0.9004 , bientôt 0.6.0, de nombreux nouveaux moyens de renommer les colonnes, conformes à l’opérateur de conduites maggritr %>% , ont été ajoutés au package.

Ces fonctions sont:

  • renommer tous
  • rename_if
  • rename_at

Il existe de nombreuses manières d’utiliser ces fonctions, mais celle qui concerne votre problème, à savoir l’utilisation du paquet ssortingngr , est la suivante:

 df <- df %>% rename_all( funs( ssortingngr::str_to_lower(.) %>% ssortingngr::str_replace_all(., '\\.', '_') ) ) 

Et donc, continuez avec la plomberie 🙂 (sans jeu de mots).

Voici un moyen de contourner la syntaxe de rename quelque peu délicate:

 myris <- iris %>% setNames(tolower(gsub("\\.","_",names(.)))) 

Pour ce cas particulier [mais assez commun], la fonction a déjà été écrite dans le package de conciergerie :

 library(janitor) iris %>% clean_names() ## sepal_length sepal_width petal_length petal_width species ## 1 5.1 3.5 1.4 0.2 setosa ## 2 4.9 3.0 1.4 0.2 setosa ## 3 4.7 3.2 1.3 0.2 setosa ## 4 4.6 3.1 1.5 0.2 setosa ## 5 5.0 3.6 1.4 0.2 setosa ## 6 5.4 3.9 1.7 0.4 setosa ## . ... ... ... ... ... 

donc tous ensemble,

 iris %>% clean_names() %>% gather(measurement, value, -species) %>% group_by(species,measurement) %>% summarise(avg_value = mean(value)) ## Source: local data frame [12 x 3] ## Groups: species [?] ## ## species measurement avg_value ##    ## 1 setosa petal_length 1.462 ## 2 setosa petal_width 0.246 ## 3 setosa sepal_length 5.006 ## 4 setosa sepal_width 3.428 ## 5 versicolor petal_length 4.260 ## 6 versicolor petal_width 1.326 ## 7 versicolor sepal_length 5.936 ## 8 versicolor sepal_width 2.770 ## 9 virginica petal_length 5.552 ## 10 virginica petal_width 2.026 ## 11 virginica sepal_length 6.588 ## 12 virginica sepal_width 2.974 

Ma tentative eloquent utilisant base, ssortingngr et dplyr:

EDIT: la bibliothèque (tidyverse) inclut maintenant les trois bibliothèques.

 library(tidyverse) # OR # library(dplyr) # library(ssortingngr) # library(maggritr) names(iris) %<>% # pipes so that changes are apply the changes back tolower() %>% str_replace_all(".", "_") 

Je le fais pour construire des fonctions avec de la tuyauterie.

 my_read_fun <- function(x) { df <- read.csv(x) %>% names(df) %<>% tolower() %>% str_replace_all("_", ".") tempdf %<>% select(a, b, c, g) } 

select() et select_all() peuvent être utilisés pour renommer des colonnes.

Si vous souhaitez renommer uniquement des colonnes spécifiques, vous pouvez utiliser select :

 iris %>% select(sepal_length = Sepal.Length, sepal_width = Sepal.Width, everything()) %>% head(2) sepal_length sepal_width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 

rename fait la même chose, sans avoir à everything() inclure everything() :

 iris %>% rename(sepal_length = Sepal.Length, sepal_width = Sepal.Width) %>% head(2) sepal_length sepal_width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 

select_all() fonctionne sur toutes les colonnes et peut prendre une fonction en argument:

 iris %>% select_all(tolower) iris %>% select_all(~gsub("\\.", "_", .)) 

ou en combinant les deux:

 iris %>% select_all(~gsub("\\.", "_", tolower(.))) %>% head(2) sepal_length sepal_width petal_length petal_width species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa