Frage

Eine der grundlegenden Datentypen in R Faktoren. Nach meiner Erfahrung Faktoren sind im Grunde ein Schmerz und ich benutze sie nie. Ich konvertiere immer Zeichen. Ich fühle mich seltsam, wie ich etwas fehlt.

Gibt es einige wichtige Beispiele von Funktionen, die Faktoren wie Gruppenvariablen verwenden, bei denen der Faktor Datentyp notwendig wird? Gibt es bestimmte Umstände, wenn ich sollte mit Faktoren werden?

War es hilfreich?

Lösung

Sie sollten Faktoren verwenden. Ja können sie ein Schmerz sein, aber meine Theorie ist, dass 90% der, warum sie ein Schmerz sind, weil in read.table und read.csv das Argument stringsAsFactors = TRUE standardmäßig (und die meisten Benutzer diese Subtilität vermissen). Ich sage, sie sind nützlich, weil Modellpaketen wie lme4 Verwendung Faktoren und geordnete Faktoren unterschiedlich passen Modelle und bestimmen die Art der Kontraste Verwendung passen. Und die grafische Darstellung von Paketen sie auch zu einer Gruppe verwenden, indem. ggplot und die meisten Modellanpassungsfunktionen coerce Zeichenvektoren zu Faktoren, so ist das Ergebnis das gleiche ist. Allerdings Sie mit Warnungen im Code am Ende:

lm(Petal.Length ~ -1 + Species, data=iris)

# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris)

# Coefficients:
#     Speciessetosa  Speciesversicolor   Speciesvirginica  
#             1.462              4.260              5.552  

iris.alt <- iris
iris.alt$Species <- as.character(iris.alt$Species)
lm(Petal.Length ~ -1 + Species, data=iris.alt)

# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris.alt)

# Coefficients:
#     Speciessetosa  Speciesversicolor   Speciesvirginica  
#             1.462              4.260              5.552  
  

Meldung Warnung: In model.matrix.default(mt, mf, contrasts):

     

umgewandelt Variable Species zu einem factor

Eine heikle Sache ist die ganze drop=TRUE Bit. In Vektoren funktioniert dies gut Ebene der Faktoren zu entfernen, die nicht in den Daten. Zum Beispiel:

s <- iris$Species
s[s == 'setosa', drop=TRUE]
#  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa
s[s == 'setosa', drop=FALSE]
#  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica

Jedoch , mit data.frames, das Verhalten von [.data.frame() ist anders: siehe diese E-Mail oder ?"[.data.frame". Mit drop=TRUE auf data.frames nicht funktioniert, wie Sie sich vorstellen:

x <- subset(iris, Species == 'setosa', drop=TRUE)  # susbetting with [ behaves the same way
x$Species
#  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica

Zum Glück können Sie Faktoren leicht mit droplevels() fallen nicht verwendete Faktorstufe für einen einzelnen Faktor oder für jeden Faktor in einem data.frame (da R 2.12) fallen zu lassen:

x <- subset(iris, Species == 'setosa')
levels(x$Species)
# [1] "setosa"     "versicolor" "virginica" 
x <- droplevels(x)
levels(x$Species)
# [1] "setosa"

Dies ist, wie Niveau zu halten, Sie haben davon ab, in ggplot Legenden ausgewählt werden.

Intern factors ganze Zahlen sind mit einem Attributebene Zeichenvektor (siehe attributes(iris$Species) und class(attributes(iris$Species)$levels)), die sauber ist. Wenn Sie einen Level-Namen ändern musste (und Sie Zeichenketten wurden unter Verwendung), wäre dies ein viel weniger effizienten Betrieb. Und ich ändere viele Ebenennamen, vor allem für ggplot Legenden. Wenn Sie gefälschte Faktoren mit Charakter Vektoren, gibt es die Gefahr, dass Sie nur ein Element ändern, und versehentlich eine separate neue Ebene erstellen.

Andere Tipps

bestellt Faktoren sind fantastisch, wenn ich Liebe Orangen passiere und Hass Äpfel aber nichts dagegen Trauben brauche ich nicht einig seltsamen Index zu verwalten, so zu sagen:

d <- data.frame(x = rnorm(20), f = sample(c("apples", "oranges", "grapes"), 20, replace = TRUE, prob = c(0.5, 0.25, 0.25)))
d$f <- ordered(d$f, c("apples", "grapes", "oranges"))
d[d$f >= "grapes", ]

Ein factor ist am analog zu einem Aufzählungstyp in anderen Sprachen. Die bestimmungsgemäße Verwendung ist für eine Variable, die nur auf einem vorgegebenen Satz von Werten annehmen können. In diesen Fällen nicht all möglicher zulässige Wert kann in einem bestimmten Satz von Daten vorhanden sein, und die „leeren“, dass genau widerspiegeln Ebene.

einige Beispiele. Für einige Daten, die überall in den Vereinigten Staaten gesammelt wurden, soll der Staat als Faktor aufgenommen werden. In diesem Fall ist die Tatsache, dass keine Fälle von einem bestimmten Zustand gesammelt wurden relevant. Es hätte Daten gewesen von diesem Zustand, aber es passiert ist (egal aus welchem ??Grund, die ein Grund von Interesse sein können) nicht sein. Wenn Heimatstadt gesammelt wurde, wäre es nicht ein Faktor sein. Es gibt keine vorge angegebene Menge möglicher Wohnort. Wenn Daten aus drei Städten statt auf nationalen gesammelt wurden, wäre die Stadt ein Faktor sein. Es gibt drei Möglichkeiten, die von Anfang an gegeben wurden und wenn keine relevanten Fälle / Daten in einer dieser drei Städten gefunden, die relevant ist

Weitere Aspekte der factors, wie ein Weg, um eine beliebige Reihenfolge, um einen Satz von Saiten zu geben, sind nützliche sekundäre Merkmale von factors, sind aber nicht der Grund für ihre Existenz.

Faktoren sind fantastisch, wenn man statistische Analyse tut und erkunden die Daten tatsächlich. Jedoch vor, daß, wenn man das Lesen, Reinigung, Fehlersuche, Zusammenführen und im Allgemeinen um die Daten zu manipulieren, Faktoren sind insgesamt Schmerz. In jüngerer Zeit, wie in den letzten Jahren haben viele der Funktionen verbessert um die Faktoren besser zu handhaben. Zum Beispiel spielt rbind mit ihnen gut. Ich kann es immer noch insgesamt Ärgernis finden haben, nachdem eine Teilmenge Funktion über leere Ebene links.

#drop a whole bunch of unused levels from a whole bunch of columns that are factors using gdata
require(gdata)
drop.levels(dataframe)

Ich weiß, dass es auf recode Stufen eines Faktor einfach ist und die Etiketten zu verfeinern und es gibt auch wunderbare Möglichkeiten, um die Ebene neu zu ordnen. Mein Gehirn kann mich erinnern, sie einfach nicht und ich habe es umlernen jedes Mal, wenn ich es verwenden. Umkodierung sollte nur viel einfacher, als es ist.

R-String-Funktionen sind sehr einfach und logisch zu verwenden. Ich ziehe es im Allgemeinen Zeichen über Faktoren also, wenn die Manipulation.

Was für ein snarky Titel!

Ich glaube, viele Schätzfunktionen ermöglichen es Ihnen, Faktoren zu verwenden, um leicht Dummy-Variablen definieren ... aber ich sie nicht dafür verwendet werden.

Ich benutze sie, wenn ich sehr großen Charakter Vektoren mit einigen einzigartigen Beobachtungen. Dies kann auf den Speicherverbrauch senken, vor allem, wenn die Strings im Zeichenvektor sind mehr-ish.

PS - Ich scherze über den Titel. Ich sah Ihren Tweet. ; -)

Faktoren sind ein hervorragendes "unique-Fälle" badging Motor. Ich habe diese schlecht oft neu erstellt, und trotz ein paar Falten gelegentlich, sie sind extrem leistungsfähig.

library(dplyr)
d <- tibble(x = sample(letters[1:10], 20, replace = TRUE))

## normalize this table into an indexed value across two tables
id <- tibble(x_u = sort(unique(d$x))) %>% mutate(x_i = row_number())
di <- tibble(x_i = as.integer(factor(d$x)))


## reconstruct d$x when needed
d2 <- inner_join(di, id) %>% transmute(x = x_u)
identical(d, d2)
## [1] TRUE

Wenn es ein besserer Weg, um diese Aufgabe zu tun ich es sehen würde gerne, ich sehe nicht, diese Fähigkeit von factor diskutiert.

tapply (und Aggregat ) beruhen auf Faktoren. Die Informationen zu Aufwand Verhältnis dieser Funktionen ist sehr hoch.

Zum Beispiel in einer einzigen Code-Zeile (den Aufruf von tapply unten) Sie können mittleren Preis von Diamanten durch Schnitt und Farbe bekommen:

> data(diamonds, package="ggplot2")

> head(dm)

   Carat     Cut    Clarity Price Color
1  0.23     Ideal     SI2   326     E
2  0.21   Premium     SI1   326     E
3  0.23      Good     VS1   327     E


> tx = with(diamonds, tapply(X=Price, INDEX=list(Cut=Cut, Color=Color), FUN=mean))

> a = sort(1:diamonds(tx)[2], decreasing=T)  # reverse columns for readability

> tx[,a]

         Color
Cut         J    I    H    G    F    E    D
Fair      4976 4685 5136 4239 3827 3682 4291
Good      4574 5079 4276 4123 3496 3424 3405
Very Good 5104 5256 4535 3873 3779 3215 3470
Premium   6295 5946 5217 4501 4325 3539 3631
Ideal     4918 4452 3889 3721 3375 2598 2629
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top