J'ai un ensemble de données appelé spam
qui contient 58 colonnes et environ 3500 lignes de données liées aux messages de spam.
Je prévois d'exécuter une régression linéaire sur cet ensemble de données à l'avenir, mais j'aimerais faire un prétraitement à l'avance et normaliser les colonnes pour avoir une moyenne et une variance d'unité nulles.
On m'a dit que la meilleure façon de procéder est avec R, donc je voudrais demander comment puis-je réaliser la normalisation avec R ? J'ai déjà les données correctement chargées et je cherche juste des packages ou des méthodes pour effectuer cette tâche.
la source
Réalisant que la question est ancienne et qu'une réponse est acceptée, je fournirai une autre réponse pour référence.
scale
est limité par le fait qu'il évolue toutes les variables . La solution ci-dessous permet de mettre à l'échelle uniquement des noms de variables spécifiques tout en préservant les autres variables inchangées (et les noms de variables pourraient être générés dynamiquement):ce qui me donne ceci:
et
EDIT 1 (2016) : Commentaire de Julian: la sortie de
scale
est une matrice Nx1, donc idéalement, nous devrions ajouter unas.vector
pour reconvertir le type de matrice en un type vectoriel. Merci Julian!EDIT 2 (2019) : Citant le commentaire de Duccio A.: Pour la dernière version de dplyr (version 0.8), vous devez changer dplyr :: funcs avec list, comme
dat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
EDIT 3 (2020) : Merci à @mj_whales: l'ancienne solution est obsolète et maintenant nous devons l'utiliser
mutate_at
.la source
f(g(x))
ce serait plus joli si on écrivaitx %>% g %>% f
. En d'autres termes,dat %>% mutate_each_(funs(scale),vars=c("y","z"))
c'est justemutate_each_(dat,funs(scale),vars=c("y","z"))
. L'opérateur aide beaucoup quand une chaîne est très longue car ellef(g(h(i(j(x)))))
peut être très difficile à lire.dplyr
(version 0.8), vous devez changerdplyr::funcs
aveclist
, commedat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
mutate_each_()
est désormais obsolète. Vous pouvez utiliser à lamutate_at()
place. La nouvelle façon de procéder serait:dat2 <- dat %>% mutate_at(c("y", "z"), scale)
C'est 3 ans. Pourtant, je pense que je dois ajouter ce qui suit:
La normalisation la plus courante est la transformation z , où vous soustrayez la moyenne et divisez par l'écart-type de votre variable. Le résultat aura une moyenne = 0 et sd = 1.
Pour cela, vous n'avez besoin d'aucun package.
C'est tout.
la source
mutate(var = (var - mean(var))/sd(var))
.myVar <- (zVar * sd(zVar)) + mean(zVar)
, non?newVar <- (zVar * sd(myVar)) + mean(myVar)
. Vous devez utiliser la moyenne / sd d'origine. Comme vous l'avez écrit, vous multipliezsd(zVar)=1
et ajoutezmean(zVar)=0
, donc rien ne changera :)Le package «Caret» fournit des méthodes de prétraitement des données (par exemple, centrage et mise à l'échelle). Vous pouvez également utiliser le code suivant:
Plus de détails: http://www.inside-r.org/node/86978
la source
Lorsque j'ai utilisé la solution indiquée par Dason, au lieu d'obtenir une trame de données en conséquence, j'ai obtenu un vecteur de nombres (les valeurs mises à l'échelle de mon df).
Si quelqu'un rencontre le même problème, vous devez ajouter as.data.frame () au code, comme ceci:
J'espère que ce sera utile pour ppl ayant le même problème!
la source
train_dt[-24] <- scale(train_dt[-24])
où "24" est le numéro de colonne à exclureVous pouvez facilement normaliser les données en utilisant également la fonction data.Normalization dans le package clusterSim. Il fournit différentes méthodes de normalisation des données.
Arguments
x type de normalisation de type
vecteur, matrice ou ensemble de données
: n0 - sans normalisation
n1 - normalisation ((x-mean) / sd)
n2 - standardisation positionnelle ((x-médiane) / folle)
n3 - unité ((x-moyenne) / plage)
n3a - unification positionnelle ((x-médiane) / plage)
n4 - unité avec zéro minimum ((x-min) / plage)
n5 - normalisation dans la plage <-1,1> ((x-moyenne) / max (abs (x-moyenne))))
n5a - normalisation positionnelle dans la plage <-1,1> ((x-médiane) / max (abs (x-médiane)))
n6 - transformation de quotient (x / sd)
n6a - transformation de quotient positionnel (x / mad)
n7 - transformation de quotient (x / plage)
n8 - transformation de quotient (x / max)
n9 - transformation de quotient (x / moyenne)
n9a - transformation de quotient positionnel (x / médiane)
n10 - transformation de quotient (x / somme)
n11 - transformation de quotient (x / sqrt (SSQ))
n12 - normalisation ((x-moyenne) / sqrt (somme ((x-moyenne) ^ 2)))
n12a - normalisation positionnelle ((x-médiane) / sqrt (somme ((x-médiane) ^ 2)))
n13 - normalisation avec zéro étant le point central ((x-milieu de gamme) / (plage / 2))
normalisation
"colonne" - normalisation par variable, "ligne" - normalisation par objet
la source
Avec la version
dplyr
0.7.4, toutes les variables peuvent être mises à l'échelle en utilisantmutate_all()
:Des variables spécifiques peuvent être exclues en utilisant
mutate_at()
:Créé le 2018-04-24 par le package reprex (v0.2.0).
la source
Encore une fois, même s'il s'agit d'une vieille question, elle est très pertinente! Et j'ai trouvé un moyen simple de normaliser certaines colonnes sans avoir besoin de packages:
Par exemple
Vous verrez que les colonnes y et z ont été normalisées. Aucun package requis :-)
la source
L'échelle peut être utilisée pour le bloc de données complet et des colonnes spécifiques. Pour des colonnes spécifiques, le code suivant peut être utilisé:
Trame de données complète
la source
Le
dplyr
package a deux fonctions qui font cela.Pour muter des colonnes spécifiques d'une table de données, vous pouvez utiliser la fonction
mutate_at()
. Pour muter toutes les colonnes, vous pouvez utilisermutate_all
.Voici un bref exemple d'utilisation de ces fonctions pour normaliser les données.
Muter des colonnes spécifiques:
Muter toutes les colonnes:
la source
Avant de trouver ce fil, j'ai eu le même problème. J'avais des types de colonnes dépendants de l'utilisateur, j'ai donc écrit une
for
boucle en les parcourant et en obtenant les colonnes nécessairesscale
. Il existe probablement de meilleures façons de le faire, mais cela a très bien résolu le problème:as.vector
est une partie nécessaire, car il s'est avéréscale
que larownames x 1
matrice n'est généralement pas ce que vous voulez avoir dans votredata.frame
.la source
Utilisez le package "recommenderlab". Téléchargez et installez le package. Ce paquet a une commande "Normalize" intégrée. Il vous permet également de choisir l'une des nombreuses méthodes de normalisation, à savoir «centre» ou «score Z». Suivez l'exemple suivant:
la source
La fonction de normalisation du package BBMisc était le bon outil pour moi car elle peut gérer les valeurs NA.
Voici comment l'utiliser:
Étant donné l'ensemble de données suivant,
des valeurs normalisées peuvent être obtenues comme ceci:
où la méthode calculée à la main ignore simplement les colmuns contenant des NA:
(NormalizedHuman se fait une liste de NAs ...)
en ce qui concerne la sélection de colonnes spécifiques pour le calcul, une méthode générique peut être employée comme celle-ci:
la source
@BBKim a à peu près donné la meilleure réponse, mais cela peut être fait plus rapidement. Je suis surpris que personne ne l’ait encore proposé.
dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5)) dat <- apply(dat, 2, function(x) (x - mean(x)) / sd(x))
la source