Ich habe einen Datensatz namens, spam
der 58 Spalten und ungefähr 3500 Datenzeilen enthält, die sich auf Spam-Nachrichten beziehen.
Ich habe vor, in Zukunft eine lineare Regression für diesen Datensatz durchzuführen, möchte jedoch vorher eine Vorverarbeitung durchführen und die Spalten so standardisieren, dass sie einen Mittelwert von Null und eine Einheitsvarianz aufweisen.
Mir wurde gesagt, dass der beste Weg, dies zu tun, R ist. Ich möchte also fragen, wie ich mit R eine Normalisierung erreichen kann . Ich habe die Daten bereits richtig geladen und suche nur nach Paketen oder Methoden, um diese Aufgabe auszuführen.
quelle
Da ich feststelle, dass die Frage alt ist und eine Antwort akzeptiert wird, werde ich eine andere Antwort als Referenz geben.
scale
wird durch die Tatsache begrenzt, dass es alle Variablen skaliert . Mit der folgenden Lösung können nur bestimmte Variablennamen skaliert werden, während andere Variablen unverändert bleiben (und die Variablennamen können dynamisch generiert werden):was mir folgendes gibt:
und
EDIT 1 (2016) : Adressiert Julians Kommentar: Die Ausgabe von
scale
ist eine Nx1-Matrix, daher sollten wir idealerweise eine hinzufügenas.vector
, um den Matrixtyp wieder in einen Vektortyp umzuwandeln. Danke Julian!EDIT 2 (2019) : Zitiert den Kommentar von Duccio A.: Für das neueste dplyr (Version 0.8) müssen Sie dplyr :: funcs mit list ändern, wie z
dat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
EDIT 3 (2020) : Dank @mj_whales: Die alte Lösung ist veraltet und jetzt müssen wir verwenden
mutate_at
.quelle
f(g(x))
, würde es schöner aussehen, wenn man schreibtx %>% g %>% f
. Mit anderen Worten,dat %>% mutate_each_(funs(scale),vars=c("y","z"))
ist gerechtmutate_each_(dat,funs(scale),vars=c("y","z"))
. Der Bediener hilft sehr, wenn eine Kette sehr lang ist, daf(g(h(i(j(x)))))
sie sehr schwer zu lesen ist.dplyr
(Version 0.8) müssen Sie Änderungdplyr::funcs
mitlist
, wiedat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
mutate_each_()
ist jetzt veraltet. Sie könnenmutate_at()
stattdessen verwenden. Der neue Weg, dies zu tun, wäre:dat2 <- dat %>% mutate_at(c("y", "z"), scale)
Das ist 3 Jahre alt. Trotzdem muss ich Folgendes hinzufügen:
Die häufigste Normalisierung ist die Z-Transformation , bei der Sie den Mittelwert subtrahieren und durch die Standardabweichung Ihrer Variablen dividieren. Das Ergebnis hat Mittelwert = 0 und sd = 1.
Dafür brauchen Sie kein Paket.
Das ist es.
quelle
mutate(var = (var - mean(var))/sd(var))
.myVar <- (zVar * sd(zVar)) + mean(zVar)
, richtig?newVar <- (zVar * sd(myVar)) + mean(myVar)
. Sie müssen den ursprünglichen Mittelwert / sd verwenden. Wie Sie es geschrieben haben, werden Sie mit multiplizierensd(zVar)=1
und hinzufügenmean(zVar)=0
, damit sich nichts ändert :)Das 'Caret'-Paket bietet Methoden zur Vorverarbeitung von Daten (z. B. Zentrieren und Skalieren). Sie können auch den folgenden Code verwenden:
Weitere Details: http://www.inside-r.org/node/86978
quelle
Als ich die von Dason angegebene Lösung verwendete, erhielt ich anstelle eines Datenrahmens einen Vektor von Zahlen (die skalierten Werte meines df).
Wenn jemand die gleichen Probleme hat, müssen Sie dem Code as.data.frame () wie folgt hinzufügen:
Ich hoffe, dies ist nützlich für Leute, die das gleiche Problem haben!
quelle
train_dt[-24] <- scale(train_dt[-24])
wobei "24" die auszuschließendeSie können die Daten auch mit data.Normalization-Funktion im clusterSim-Paket problemlos normalisieren. Es bietet verschiedene Methoden zur Datennormalisierung.
Argumente
x
Vektor-, Matrix- oder Datensatztyp
Normalisierungstyp: n0 - ohne Normalisierung
n1 - Standardisierung ((x-Mittelwert) / sd)
n2 - Positionsstandardisierung ((x-Median) / verrückt)
n3 - Einheit ((x-Mittelwert) / Bereich)
n3a - Positionseinheit ((x-Median) / Bereich)
n4 - Einheit mit Null Minimum ((x-min) / Bereich)
n5 - Normalisierung im Bereich <-1,1> ((x-Mittelwert) / max (abs (x-Mittelwert)))
n5a - Positionsnormalisierung im Bereich <-1,1> ((x-Median) / max (abs (x-Median)))
n6 - Quotiententransformation (x / sd)
n6a - Positionsquotiententransformation (x / mad)
n7 - Quotiententransformation (x / Bereich)
n8 - Quotiententransformation (x / max)
n9 - Quotiententransformation (x / Mittelwert)
n9a - Positionsquotiententransformation (x / Median)
n10 - Quotiententransformation (x / Summe)
n11 - Quotiententransformation (x / sqrt (SSQ))
n12 - Normalisierung ((x-Mittelwert) / sqrt (Summe ((x-Mittelwert) ^ 2)))
n12a - Positionsnormalisierung ((x-Median) / sqrt (Summe ((x-Median) ^ 2)))
n13 - Normalisierung mit Null als Mittelpunkt ((x-Mittelbereich) / (Bereich / 2))
Normalisierung
"Spalte" - Normalisierung nach Variable, "Zeile" - Normalisierung nach Objekt
quelle
Mit
dplyr
v0.7.4 können alle Variablen skaliert werden mitmutate_all()
:Bestimmte Variablen können ausgeschlossen werden mit
mutate_at()
:Erstellt am 24.04.2018 durch das reprex-Paket (v0.2.0).
quelle
Auch wenn dies eine alte Frage ist, ist sie sehr relevant! Und ich habe einen einfachen Weg gefunden, um bestimmte Spalten zu normalisieren, ohne dass Pakete erforderlich sind:
Beispielsweise
Sie werden sehen, dass die Spalten y und z normalisiert wurden. Keine Pakete benötigt :-)
quelle
Die Skalierung kann sowohl für den vollständigen Datenrahmen als auch für bestimmte Spalten verwendet werden. Für bestimmte Spalten kann folgender Code verwendet werden:
Voller Datenrahmen
quelle
Das
dplyr
Paket hat zwei Funktionen, die dies tun.Um bestimmte Spalten einer Datentabelle zu mutieren , können Sie die Funktion verwenden
mutate_at()
. Um alle Spalten zu mutieren , können Sie verwendenmutate_all
.Das Folgende ist ein kurzes Beispiel für die Verwendung dieser Funktionen zum Standardisieren von Daten.
Mutieren Sie bestimmte Spalten:
Mutieren Sie alle Spalten:
quelle
Bevor ich diesen Thread gefunden habe, hatte ich das gleiche Problem. Ich hatte benutzerabhängige Spaltentypen, also schrieb ich eine
for
Schleife, die sie durchlief und die benötigten Spaltenscale
abrief. Es gibt wahrscheinlich bessere Möglichkeiten, aber dies hat das Problem ganz gut gelöst:as.vector
Teil ist eine notwendige, denn es stellte sich heraus ,scale
tutrownames x 1
Matrix , die in der Regel nicht , was Sie in Ihrem haben wollendata.frame
.quelle
Verwenden Sie das Paket "recommenderlab". Laden Sie das Paket herunter und installieren Sie es. In diesem Paket ist der Befehl "Normalisieren" eingebaut. Sie können auch eine der vielen Methoden zur Normalisierung auswählen, nämlich 'Mitte' oder 'Z-Score'. Befolgen Sie das folgende Beispiel:
quelle
Die Normalisierungsfunktion aus dem BBMisc-Paket war das richtige Werkzeug für mich, da sie mit NA-Werten umgehen kann.
So verwenden Sie es:
Angesichts des folgenden Datensatzes
normalisierte Werte können wie folgt erhalten werden:
wobei die von Hand berechnete Methode nur Colmuns ignoriert, die NAs enthalten:
(normalizedHuman wird eine Liste von NAs erstellt ...)
In Bezug auf die Auswahl bestimmter Spalten für die Berechnung kann eine generische Methode wie die folgende angewendet werden:
quelle
@BBKim gab so ziemlich die beste Antwort, aber es kann nur kürzer gemacht werden. Ich bin überrascht, dass noch niemand darauf gekommen ist.
dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5)) dat <- apply(dat, 2, function(x) (x - mean(x)) / sd(x))
quelle