Wenn ich einen Faktor in eine Zahl oder eine Ganzzahl umwandle, erhalte ich die zugrunde liegenden Ebenencodes, nicht die Werte als Zahlen.
f <- factor(sample(runif(5), 20, replace = TRUE))
## [1] 0.0248644019011408 0.0248644019011408 0.179684827337041
## [4] 0.0284090070053935 0.363644931698218 0.363644931698218
## [7] 0.179684827337041 0.249704354675487 0.249704354675487
## [10] 0.0248644019011408 0.249704354675487 0.0284090070053935
## [13] 0.179684827337041 0.0248644019011408 0.179684827337041
## [16] 0.363644931698218 0.249704354675487 0.363644931698218
## [19] 0.179684827337041 0.0284090070053935
## 5 Levels: 0.0248644019011408 0.0284090070053935 ... 0.363644931698218
as.numeric(f)
## [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2
as.integer(f)
## [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2
Ich muss zurückgreifen paste
, um die wahren Werte zu erhalten:
as.numeric(paste(f))
## [1] 0.02486440 0.02486440 0.17968483 0.02840901 0.36364493 0.36364493
## [7] 0.17968483 0.24970435 0.24970435 0.02486440 0.24970435 0.02840901
## [13] 0.17968483 0.02486440 0.17968483 0.36364493 0.24970435 0.36364493
## [19] 0.17968483 0.02840901
Gibt es eine bessere Möglichkeit, einen Faktor in einen numerischen Wert umzuwandeln?
attributes(f)
), daher glaube ich nicht, dass daran etwas falsch istas.numeric(paste(f))
. Vielleicht ist es besser zu überlegen, warum (im spezifischen Kontext) Sie überhaupt einen Faktor bekommen, und zu versuchen, dies zu stoppen. Ist dasdec
Argument beispielsweiseread.table
richtig eingestellt?df %>% convert(num(column))
. Oder wenn Sie einen Faktorvektor haben, den Sie verwenden könnenas_reliable_num(factor_vector)
Antworten:
Siehe den Abschnitt Warnung von
?factor
:Die FAQ zu R hat ähnliche Ratschläge .
Warum ist
as.numeric(levels(f))[f]
effizienter alsas.numeric(as.character(f))
?as.numeric(as.character(f))
ist effektivas.numeric(levels(f)[f])
, also führen Sie die Konvertierung in numerischelength(x)
Werte anstelle vonnlevels(x)
Werten durch. Der Geschwindigkeitsunterschied ist am deutlichsten bei langen Vektoren mit wenigen Pegeln. Wenn die Werte größtenteils eindeutig sind, gibt es keinen großen Geschwindigkeitsunterschied. Unabhängig davon, wie Sie die Konvertierung durchführen, ist es unwahrscheinlich, dass dieser Vorgang den Engpass in Ihrem Code darstellt. Machen Sie sich also keine allzu großen Sorgen.Einige Timings
quelle
R verfügt über eine Reihe von (nicht dokumentierten) Komfortfunktionen zum Umrechnen von Faktoren:
as.character.factor
as.data.frame.factor
as.Date.factor
as.list.factor
as.vector.factor
Aber ärgerlicherweise gibt es nichts, was mit dem Faktor -> numerische Konvertierung zu tun hätte . Als Erweiterung von Joshua Ulrichs Antwort würde ich vorschlagen, diese Lücke mit der Definition Ihrer eigenen Redewendung zu überwinden:
dass Sie am Anfang Ihres Skripts oder noch besser in Ihrer
.Rprofile
Datei speichern können.quelle
as.integer(factor)
die zugrunde liegenden Ganzzahlcodes zurückgegeben werden (wie im Beispielabschnitt von gezeigt?factor
). Es ist wahrscheinlich in Ordnung, diese Funktion in Ihrer globalen Umgebung zu definieren, aber Sie können Probleme verursachen, wenn Sie sie tatsächlich als S3-Methode registrieren.factor->numeric
Umwandlung viel vor der Realisierung , dass es in der Tat ein Manko von R: einige Komfortfunktion sollte verfügbar sein ... Nannte esas.numeric.factor
macht Sinn für mich, aber YMMV.v=NA;as.numeric.factor(v)
oder verwendet habenv='something';as.numeric.factor(v)
, dann sollte es, sonst haben Sie irgendwo eine seltsame Sache vor sich.Am einfachsten wäre es, die
unfactor
Funktion aus dem Paket varhandle zu verwendenDieses Beispiel kann ein schneller Start sein:
quelle
unfactor
Funktion wird zuerst in den Zeichendatentyp und dann wieder in den numerischen Typ konvertiert. Geben Sieunfactor
an der Konsole ein und Sie können es in der Mitte der Funktion sehen. Daher gibt es keine bessere Lösung als das, was der Fragesteller bereits hatte.unfactor
Funktion kümmert sich um Dinge, die nicht in numerische konvertiert werden können. Überprüfen Sie die Beispiele inhelp("unfactor")
library("varhandle")
) zuerst laden sollten (wie ich in der ersten Zeile meiner Antwort erwähnt habe !!)as.numeric()
undas.character()
in eine falsche Reihenfolge bringen;) Was Ihr Codeblock tut, ist, den Ebenenindex des Faktors in eine Zeichenmatrix umzuwandeln, also was Sie am und haben werden ist ein Zeichenvektor, der einige Zahlen enthält, die einmal einer bestimmten Ebene Ihres Faktors zugewiesen wurden. Funktionen in diesem Paket sollen diese Verwirrungen verhindernHinweis: Diese spezielle Antwort dient nicht zum Konvertieren von numerisch bewerteten Faktoren in numerische Faktoren, sondern zum Konvertieren von kategorialen Faktoren in die entsprechenden Ebenennummern.
Jede Antwort in diesem Beitrag konnte keine Ergebnisse für mich generieren, NAs wurden generiert.
Was für mich funktioniert hat ist das -
quelle
y<-factor(c("5","15","20","2")); unclass(y) %>% as.numeric
Dies ergibt 4,1,3,2, nicht 5,15,20,2. Dies scheint eine falsche Information zu sein.as.numeric(y)
hätte gut funktionieren sollen, keine Notwendigkeit für dieunclass()
. Aber genau darum ging es in dieser Frage nicht. Diese Antwort ist hier nicht angemessen.Dies ist nur möglich, wenn die Faktorbezeichnungen mit den ursprünglichen Werten übereinstimmen. Ich werde es mit einem Beispiel erklären.
Angenommen, die Daten sind Vektoren
x
:Jetzt werde ich einen Faktor mit vier Bezeichnungen erstellen:
1)
x
ist mit Typ double,f
ist mit Typ Integer. Dies ist der erste unvermeidbare Informationsverlust. Faktoren werden immer als ganze Zahlen gespeichert.2) Es ist nicht möglich, zu den ursprünglichen Werten (10, 20, 30, 40) zurückzukehren, die nur
f
verfügbar sind. Wir können sehen, dassf
nur ganzzahlige Werte 1, 2, 3, 4 und zwei Attribute enthalten sind - die Liste der Bezeichnungen ("A", "B", "C", "D") und das Klassenattribut "Faktor". Nichts mehr.Um zu den ursprünglichen Werten zurückzukehren, müssen wir die Werte der Ebenen kennen, die beim Erstellen des Faktors verwendet wurden. In diesem Fall
c(10, 20, 30, 40)
. Wenn wir die ursprünglichen Werte kennen (in der richtigen Reihenfolge), können wir zu den ursprünglichen Werten zurückkehren.Dies funktioniert nur, wenn für alle möglichen Werte in den Originaldaten Beschriftungen definiert wurden.
Wenn Sie also die ursprünglichen Werte benötigen, müssen Sie diese beibehalten. Andernfalls besteht eine hohe Wahrscheinlichkeit, dass es nicht möglich ist, nur von einem Faktor zu ihnen zurückzukehren.
quelle
Sie können verwenden,
hablar::convert
wenn Sie einen Datenrahmen haben. Die Syntax ist einfach:Probe df
Lösung
gibt Ihnen:
Oder wenn eine Spalte eine Ganzzahl und eine Zahl sein soll:
Ergebnisse in:
quelle
Sieht aus wie die Lösung als numerisch (Ebenen (f)) [f] funktioniert nicht mehr mit R 4.0.
Alternative Lösung:
quelle
Aus den vielen Antworten, die ich lesen konnte, bestand die einzige Möglichkeit darin, die Anzahl der Variablen entsprechend der Anzahl der Faktoren zu erweitern. Wenn Sie eine Variable "pet" mit den Ebenen "dog" und "cat" haben, erhalten Sie pet_dog und pet_cat.
In meinem Fall wollte ich bei der gleichen Anzahl von Variablen bleiben, indem ich nur die Faktorvariable in eine numerische Variable übersetzte, die auf viele Variablen mit vielen Ebenen angewendet werden kann, so dass beispielsweise cat = 1 und dog = 0 sind.
Nachfolgend finden Sie die entsprechende Lösung:
quelle
spät , um das Spiel, zufällig fand ich
trimws()
umwandeln kannfactor(3:5)
zuc("3","4","5")
. Dann können Sie anrufenas.numeric()
. Das ist:quelle
trimws
over empfehlen würden,as.character
wie in der akzeptierten Antwort beschrieben? Mir scheint, es sei denn, Sie hatten tatsächlich Leerzeichen, die Sie entfernen mussten,trimws
werden nur eine Menge unnötiger regulärer Ausdrucksarbeiten ausführen, um das gleiche Ergebnis zurückzugeben.