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ühren read.csv
sind stringsAsFactors = 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:
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
Warnmeldung: In model.matrix.default(mt, mf, contrasts)
:
Variable Species
konvertiert in afactor
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:
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.frame
s, der das Verhalten [.data.frame()
ist anders: sehen Sie diese E - Mail oder ?"[.data.frame"
. Die Verwendung von drop=TRUE
on data.frame
s funktioniert nicht so, wie Sie es sich vorstellen können:
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
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 a data.frame
(seit R 2.12) löschen:
x <- subset(iris, Species == 'setosa')
levels(x$Species)
# [1] "setosa" "versicolor" "virginica"
x <- droplevels(x)
levels(x$Species)
# [1] "setosa"
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 (siehe attributes(iris$Species)
und class(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ür ggplot
Legenden. Wenn Sie Faktoren mit Zeichenvektoren vortäuschen, besteht das Risiko, dass Sie nur ein Element ändern und versehentlich eine separate neue Ebene erstellen.