Einer der grundlegenden Datentypen in R sind Faktoren. Nach meiner Erfahrung sind Faktoren im Grunde genommen ein Schmerz und ich benutze sie nie. Ich konvertiere immer in Zeichen. Ich fühle mich seltsam, als würde mir etwas fehlen.
Gibt es einige wichtige Beispiele für Funktionen, die Faktoren als Gruppierungsvariablen verwenden, bei denen der Faktordatentyp erforderlich wird? Gibt es bestimmte Umstände , als ich sollte Faktoren verwenden?
r
language-design
internals
r-factor
JD Long
quelle
quelle
Antworten:
Sie sollten Faktoren verwenden. Ja, sie können ein Schmerz sein, aber meine Theorie ist, dass 90% der Gründe, warum sie ein Schmerz sind , auf das Argument in
read.table
und zurückzuführenread.csv
sindstringsAsFactors = TRUE
(und die meisten Benutzer vermissen diese Subtilität). Ich sage, sie sind nützlich, weil Modellanpassungspakete wie lme4 Faktoren und geordnete Faktoren verwenden, um Modelle unterschiedlich anzupassen und die Art der zu verwendenden Kontraste zu bestimmen. Grafikpakete verwenden sie auch zum Gruppieren nach.ggplot
und die meisten Modellanpassungsfunktionen zwingen Zeichenvektoren zu Faktoren, sodass das Ergebnis dasselbe ist. Am Ende werden jedoch Warnungen in Ihrem Code angezeigt:Eine schwierige Sache ist das ganze
drop=TRUE
Stück. In Vektoren funktioniert dies gut, um Ebenen von Faktoren zu entfernen, die nicht in den Daten enthalten sind. Beispielsweise:Jedoch , mit
data.frame
s, der das Verhalten[.data.frame()
ist anders: sehen Sie diese E - Mail oder?"[.data.frame"
. Die Verwendung vondrop=TRUE
ondata.frame
s funktioniert nicht so, wie Sie es sich vorstellen können:Glücklicherweise können Sie Faktoren leicht löschen, indem Sie
droplevels()
nicht verwendete Faktorstufen für einen einzelnen Faktor oder für jeden Faktor in adata.frame
(seit R 2.12) löschen:Auf diese Weise verhindern Sie, dass von Ihnen ausgewählte Ebenen betreten werden
ggplot
Legenden geraten.Intern sind
factor
s Ganzzahlen mit einem Zeichenvektor auf Attributebene (sieheattributes(iris$Species)
undclass(attributes(iris$Species)$levels)
), der sauber ist. Wenn Sie einen Ebenennamen ändern müssten (und Zeichenfolgen verwenden würden), wäre dies eine viel weniger effiziente Operation. Und ich ändere Level-Namen sehr, besonders fürggplot
Legenden. Wenn Sie Faktoren mit Zeichenvektoren vortäuschen, besteht das Risiko, dass Sie nur ein Element ändern und versehentlich eine separate neue Ebene erstellen.quelle
stringsAsFactors
ist keine Funktion.geordnete Faktoren sind fantastisch, wenn ich Orangen liebe und Äpfel hasse, aber nichts gegen Trauben habe, muss ich keinen seltsamen Index verwalten, um dies zu sagen:
quelle
d$f <- ordered(d$f, c("apples", "grapes", "oranges"))
? Ich hätte vermutet, dass es diese im Datenrahmen bestellt hat, aber nachdem ich diese Zeile ausgeführt und den Datenrahmen gedruckt habe, ändert sich nichts. Erzwingt es nur eine interne Bestellung, obwohl sich die gedruckte Bestellung nicht ändert?A
factor
ist am analogsten zu einem Aufzählungstyp in anderen Sprachen. Die geeignete Verwendung ist für eine Variable, die nur einen der vorgeschriebenen Werte annehmen kann. In diesen Fällen ist möglicherweise nicht jeder mögliche zulässige Wert in einem bestimmten Datensatz vorhanden, und die "leeren" Ebenen spiegeln dies genau wider.Betrachten Sie einige Beispiele. Für einige Daten, die in den gesamten Vereinigten Staaten gesammelt wurden, sollte der Staat als Faktor erfasst werden. In diesem Fall ist die Tatsache relevant, dass keine Fälle aus einem bestimmten Staat gesammelt wurden. Es hätte Daten aus diesem Zustand geben können, aber es gab (aus welchem Grund auch immer, was ein Grund von Interesse sein könnte) nicht. Wenn die Heimatstadt gesammelt würde, wäre dies kein Faktor. Es gibt keine vorgegebenen möglichen Heimatstädte. Wenn Daten nicht national, sondern aus drei Städten erhoben würden, wäre die Stadt ein Faktor: Zu Beginn wurden drei Auswahlmöglichkeiten getroffen, und wenn in einer dieser drei Städte keine relevanten Fälle / Daten gefunden wurden, ist dies relevant.
Andere Aspekte von
factor
s, wie die Bereitstellung einer Möglichkeit, einer Reihe von Zeichenfolgen eine beliebige Sortierreihenfolge zuzuweisen, sind nützliche sekundäre Merkmale vonfactor
s, aber nicht der Grund für ihre Existenz.quelle
Faktoren sind fantastisch, wenn man statistische Analysen durchführt und die Daten tatsächlich untersucht. Zuvor sind jedoch Faktoren beim Lesen, Bereinigen, Beheben von Problemen, Zusammenführen und allgemeinen Bearbeiten der Daten ein totaler Schmerz. In jüngerer Zeit, wie in den letzten Jahren, haben sich viele Funktionen verbessert, um die Faktoren besser handhaben zu können. Zum Beispiel spielt rbind gut mit ihnen. Ich finde es immer noch ein totales Ärgernis, nach einer Teilmengenfunktion leere Ebenen übrig zu haben.
Ich weiß, dass es einfach ist, die Ebenen eines Faktors neu zu codieren und die Beschriftungen neu auszurichten, und es gibt auch wunderbare Möglichkeiten, die Ebenen neu zu ordnen. Mein Gehirn kann sich einfach nicht an sie erinnern und ich muss es jedes Mal neu lernen, wenn ich es benutze. Die Neukodierung sollte viel einfacher sein als sie ist.
Die String-Funktionen von R sind recht einfach und logisch zu bedienen. Bei der Manipulation bevorzuge ich im Allgemeinen Zeichen gegenüber Faktoren.
quelle
droplevels()
. Und die Faktoren werden standardmäßig nicht neu geordnet.Was für ein bissiger Titel!
Ich glaube, viele Schätzfunktionen ermöglichen es Ihnen, Faktoren zu verwenden, um Dummy-Variablen einfach zu definieren ... aber ich verwende sie dafür nicht.
Ich benutze sie, wenn ich sehr große Zeichenvektoren mit wenigen einzigartigen Beobachtungen habe. Dies kann den Speicherverbrauch verringern, insbesondere wenn die Zeichenfolgen im Zeichenvektor länger sind.
PS: Ich scherze über den Titel. Ich habe deinen Tweet gesehen. ;-);
quelle
?factor
es R-2.6.0 und es heißt: "Ganzzahlige Werte werden in 4 Bytes gespeichert, während jeder Verweis auf eine Zeichenfolge einen Zeiger von 4 oder 8 Bytes benötigt." Würden Sie beim Konvertieren in Faktor Platz sparen, wenn die Zeichenfolge 8 Byte benötigt?N=100000
ich habe 391,5 Kb gegen 391,8 Kb. Der Faktor benötigt also wenig mehr Speicher.Faktoren sind ein ausgezeichneter "Einzelfälle" -Ausweismotor. Ich habe dies viele Male schlecht nachgebildet, und trotz einiger Falten sind sie extrem stark.
Wenn es einen besseren Weg gibt, diese Aufgabe zu erledigen, würde ich sie gerne sehen, ich sehe diese Fähigkeit der
factor
Diskussion nicht.quelle
tapply (und aggregieren ) stützen sich auf Faktoren. Das Informations-Aufwand-Verhältnis dieser Funktionen ist sehr hoch.
Zum Beispiel können Sie in einer einzelnen Codezeile (der Aufruf, unten zu tippen ) den Durchschnittspreis für Diamanten nach Schnitt und Farbe ermitteln:
quelle