(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:
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