395 Stimmen

data.frame-Spalten von Faktoren in Zeichen umwandeln

Ich habe einen Datenrahmen. Nennen wir ihn bob :

> head(bob)
                 phenotype                         exclusion
GSM399350 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399351 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399352 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399353 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399354 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399355 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-

Ich möchte die Zeilen dieses Datenrahmens verketten (dies wird eine weitere Frage sein). Aber sehen Sie:

> class(bob$phenotype)
[1] "factor"

Bob Spalten sind Faktoren. Also, zum Beispiel

> as.character(head(bob))
[1] "c(3, 3, 3, 6, 6, 6)"       "c(3, 3, 3, 3, 3, 3)"      
[3] "c(29, 29, 29, 30, 30, 30)"

Ich verstehe das nicht ganz, aber ich vermute, dass es sich um Indizes für die Ebenen der Faktoren der Säulen (des Hofes von König Caractacus) von bob ? Nicht das, was ich brauche.

Seltsamerweise kann ich durch die Spalten von bob von Hand, und tun

bob$phenotype <- as.character(bob$phenotype)

was gut funktioniert. Und nach einiger Tipparbeit kann ich einen data.frame erhalten, dessen Spalten Zeichen und nicht Faktoren sind. Meine Frage lautet also: Wie kann ich dies automatisch tun? Wie kann ich einen data.frame mit Faktorenspalten in einen data.frame mit Zeichenspalten umwandeln, ohne jede Spalte manuell durchgehen zu müssen?

Zusatzfrage: Warum funktioniert der manuelle Ansatz?

16voto

Omar Wagih Punkte 8082

Ich mache diese Funktion in der Regel bei allen meinen Projekten mit. Schnell und einfach.

unfactorize <- function(df){
  for(i in which(sapply(df, class) == "factor")) df[[i]] = as.character(df[[i]])
  return(df)
}

11voto

George Dontas Punkte 28585

Eine andere Möglichkeit ist die Konvertierung mit apply

bob2 <- apply(bob,2,as.character)

Und eine bessere (die vorherige ist von der Klasse 'Matrix')

bob2 <- as.data.frame(as.matrix(bob),stringsAsFactors=F)

9voto

Matt Parker Punkte 25875

Update: Hier ist ein Beispiel für etwas, das nicht funktioniert. Ich dachte, es würde, aber ich denke, dass die Option stringsAsFactors nur auf Zeichenketten funktioniert - es lässt die Faktoren allein.

Versuchen Sie dies:

bob2 <- data.frame(bob, stringsAsFactors = FALSE)

Generell gilt: Wenn Sie Probleme mit Faktoren haben, die Zeichen sein sollten, gibt es eine stringsAsFactors (einschließlich einer globalen Einstellung), die Ihnen hilft.

8voto

aL3xa Punkte 33989

Oder Sie können versuchen transform :

newbob <- transform(bob, phenotype = as.character(phenotype))

Achten Sie nur darauf, dass Sie alle Faktoren, die Sie in Zeichen umwandeln möchten, angeben.

Oder Sie können so vorgehen und alle Schädlinge mit einem Schlag töten:

newbob_char <- as.data.frame(lapply(bob[sapply(bob, is.factor)], as.character), stringsAsFactors = FALSE)
newbob_rest <- bob[!(sapply(bob, is.factor))]
newbob <- cbind(newbob_char, newbob_rest)

Es ist pas gute Idee, die Daten so in den Code zu packen, könnte ich die sapply Teil getrennt (eigentlich ist es viel einfacher, es so zu machen), aber Sie verstehen, worauf ich hinaus will... Ich habe den Code nicht überprüft, weil ich nicht zu Hause bin, also hoffe ich, dass es funktioniert! =)

Dieser Ansatz hat jedoch einen Nachteil... Sie müssen die Spalten anschließend neu organisieren, während Sie mit transform Sie können tun, was Sie wollen, aber auf Kosten von "pedestrian-style-code-writting" ...

Na also... =)

7voto

Fügen Sie am Anfang Ihres Datenrahmens Folgendes ein stringsAsFactors = FALSE alle Missverständnisse zu ignorieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X