Warum zurückkehren as.factor ein Zeichen bei der Verwendung innerhalb anwenden?
Frage
Ich möchte Variablen in Faktoren konvertieren apply()
mit:
a <- data.frame(x1 = rnorm(100),
x2 = sample(c("a","b"), 100, replace = T),
x3 = factor(c(rep("a",50) , rep("b",50))))
a2 <- apply(a, 2,as.factor)
apply(a2, 2,class)
Ergebnisse in:
x1 x2 x3
"character" "character" "character"
Ich verstehe nicht, warum diese Ergebnisse in Zeichenvektoren statt Faktorvektoren.
Lösung
apply
konvertiert Ihre data.frame auf eine Zeichenmatrix. Verwendung lapply
:
lapply(a, class)
# $x1
# [1] "numeric"
# $x2
# [1] "factor"
# $x3
# [1] "factor"
Im zweiten Befehl apply führen wandelt zur Zeichenmatrix, unter Verwendung von lapply
:
a2 <- lapply(a, as.factor)
lapply(a2, class)
# $x1
# [1] "factor"
# $x2
# [1] "factor"
# $x3
# [1] "factor"
Aber für einfache Suchen Sie str
verwenden:
str(a)
# 'data.frame': 100 obs. of 3 variables:
# $ x1: num -1.79 -1.091 1.307 1.142 -0.972 ...
# $ x2: Factor w/ 2 levels "a","b": 2 1 1 1 2 1 1 1 1 2 ...
# $ x3: Factor w/ 2 levels "a","b": 1 1 1 1 1 1 1 1 1 1 ...
Zusätzliche Erklärung nach Kommentaren:
Warum wird die lapply Arbeit während gilt nicht?
Das erste, was apply
tut, ist ein Argument an eine Matrix zu konvertieren. So ist apply(a)
entspricht apply(as.matrix(a))
. Wie Sie sehen können Sie str(as.matrix(a))
gibt:
chr [1:100, 1:3] " 0.075124364" "-1.608618269" "-1.487629526" ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:3] "x1" "x2" "x3"
Es sind keine weiteren Faktoren, so class
Rückkehr "character"
für alle Spalten.
lapply
arbeitet auf Spalten so gibt Ihnen, was Sie wollen (es tut so etwas wie class(a$column_name)
für jede Spalte).
Sie können in Hilfe apply
sehen, warum apply
und as.factor
nicht funktioniert:
In allen Fällen wird das Ergebnis dazu gezwungen durch as.vector zu einem des Basisvektor Typen vor den Abmessungen festgelegt sind, so daß (beispielsweise) Faktor Ergebnisse wird zu einem Zeichen-Array umgewandelt werden.
Warum sapply
und as.factor
funktioniert nicht Sie in der Hilfe zu sapply
sehen können:
Wert (...) Ein Atom Vektor oder eine Matrix oder eine Liste von der gleichen Länge wie X (...) Wenn Vereinfachung auftritt, wird der Ausgang Art ist aus der höchsten bestimmt Typ des Rückgabewerte in der Hierarchie NULL
Sie nie Matrix von Faktoren oder data.frame erhalten.
Wie Ausgabe data.frame
konvertieren?
Einfache, Verwendung as.data.frame
, wie Sie in Kommentar schrieb:
a2 <- as.data.frame(lapply(a, as.factor))
str(a2)
'data.frame': 100 obs. of 3 variables:
$ x1: Factor w/ 100 levels "-2.49629293159922",..: 60 6 7 63 45 93 56 98 40 61 ...
$ x2: Factor w/ 2 levels "a","b": 1 1 2 2 2 2 2 1 2 2 ...
$ x3: Factor w/ 2 levels "a","b": 1 1 1 1 1 1 1 1 1 1 ...
Aber wenn Sie ausgewählte Zeichenspalten mit factor
ersetzen möchten gibt es einen Trick:
a3 <- data.frame(x1=letters, x2=LETTERS, x3=LETTERS, stringsAsFactors=FALSE)
str(a3)
'data.frame': 26 obs. of 3 variables:
$ x1: chr "a" "b" "c" "d" ...
$ x2: chr "A" "B" "C" "D" ...
$ x3: chr "A" "B" "C" "D" ...
columns_to_change <- c("x1","x2")
a3[, columns_to_change] <- lapply(a3[, columns_to_change], as.factor)
str(a3)
'data.frame': 26 obs. of 3 variables:
$ x1: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
$ x2: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ...
$ x3: chr "A" "B" "C" "D" ...
Sie können es verwenden, um alle Spalten zu ersetzen mit:
a3 <- data.frame(x1=letters, x2=LETTERS, x3=LETTERS, stringsAsFactors=FALSE)
a3[, ] <- lapply(a3, as.factor)
str(a3)
'data.frame': 26 obs. of 3 variables:
$ x1: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
$ x2: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ...
$ x3: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ...