Warum zurückkehren as.factor ein Zeichen bei der Verwendung innerhalb anwenden?

StackOverflow https://stackoverflow.com/questions/2392216

  •  25-09-2019
  •  | 
  •  

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.

War es hilfreich?

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 ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top