2017-10-19 10 views
1

Je suis récemment passé de la manipulation de données courantes dans R à la tidyverse. Mais j'ai eu un problème concernant la mise à l'échelle des colonnes avec la fonction scale(). Mes données sont constituées de colonnes dont certaines sont numériques et d'autres catégorielles. La dernière colonne est également la valeur y des données. Je veux donc mettre à l'échelle toutes les colonnes numériques, mais pas la dernière colonne. Avec la fonction select(), je peux écrire une très courte ligne de code et sélectionner toutes mes colonnes numériques qui doivent être mises à l'échelle si j'ajoute l'argument ends_with("..."). Mais je ne peux pas vraiment faire usage de cela avec la mise à l'échelle. Là, je dois utiliser transmute(feature1=scale(feature1),feature2=scale(feature2)...) et nommer chaque fonctionnalité individuellement. Cela fonctionne bien, mais gonfle le code. Donc, ma question est la suivante:R: Mettre à l'échelle un sous-ensemble de plusieurs colonnes (avec des noms similaires) avec dplyr

Y at-il une solution intelligente pour manipuler la colonne par colonne sans la nécessité de traiter chaque nom de colonne avec transmuter?

J'imagine quelque chose comme:

transmute(ends_with("...")=scale(ends_with("..."),featureX,featureZ) 

(bien que cela ne fonctionne pas)

Un grand merci à l'avance

Répondre

1
library(tidyverse) 
data("economics") 

# add variables that are not numeric 
economics[7:9] <- sample(LETTERS[1:10], size = dim(economics[1]), replace = TRUE) 

# add a 'y' column (for illustration) 
set.seed(1) 
economics$y <- rnorm(n = dim(economics)[1]) 

economics_modified <- economics %>% 
         select(-y) %>% 
         transmute_if(is.numeric, scale) %>% 
         add_column(y = economics$y) 

Si vous voulez garder ces colonnes ne sont pas numériques, remplacez transmute_if par modify_if. (Il peut y avoir une façon plus intelligente d'exclure la mise à l'échelle de la colonne y.)