Konvertieren Sie das Spaltenformat data.frame vom Zeichen in den Faktor


153

Ich möchte das Format (die Klasse) einiger Spalten meines data.frame-Objekts ( mydf) von Zeichen zu Faktor ändern .

Ich möchte dies nicht tun, wenn ich die Textdatei nach read.table()Funktion lese .

Jede Hilfe wäre dankbar.


12
mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn)
tim riffe

Vielen Dank! aber ich habe ein anderes Problem. Ich habe den Namen jeder Spalte in einem Array von Zeichen col_names []. Wie kann ich den obigen Befehl verwenden (mydf $ col_names [i]) funktioniert nicht.
Rasoul

Gibt es eine Möglichkeit, dies automatisch für alle Zeichenvariablen zu tun, wie dies data.frame mit stringsAsFactors tut?
Etienne Low-Décarie

@ EtienneLow-Décarie: nur unclassund verwenden Sie data.frameauf das Ergebnis.
IRTFM

Antworten:


196

Hallo, willkommen in der Welt von R.

mtcars  #look at this built in data set
str(mtcars) #allows you to see the classes of the variables (all numeric)

#one approach it to index with the $ sign and the as.factor function
mtcars$am <- as.factor(mtcars$am)
#another approach
mtcars[, 'cyl'] <- as.factor(mtcars[, 'cyl'])
str(mtcars)  # now look at the classes

Dies funktioniert auch für Zeichen, Datumsangaben, Ganzzahlen und andere Klassen

Da Sie neu bei R sind, würde ich vorschlagen, dass Sie sich diese beiden Websites ansehen:

R Referenzhandbücher: http://cran.r-project.org/manuals.html

R Referenzkarte: http://cran.r-project.org/doc/contrib/Short-refcard.pdf


Vielen Dank! aber ich habe ein anderes Problem. Ich habe den Namen jeder Spalte in einem Array von Zeichen col_names []. Wie kann ich den obigen Befehl verwenden (weder mydf$col_names[i]nochmydf[,col_names[i]] funktioniert nicht.)
Rasoul

1
@Rasoul, mydf[, col_names]werde das tun
DrDom

3
+1 für die refs. Dies sind grundlegende Dinge, die in Ordnung zu fragen sind, aber es ist auch in Ordnung, sich der umfangreichen Arbeit bewusst zu sein, die in diese (und ähnliche) Arbeiten gesteckt wurde.
Roman Luštrik

84
# To do it for all names
df[] <- lapply( df, factor) # the "[]" keeps the dataframe structure
 col_names <- names(df)
# do do it for some names in a vector named 'col_names'
df[col_names] <- lapply(df[col_names] , factor)

Erläuterung. Alle Datenrahmen sind Listen, und die Ergebnisse von [Argumenten mit mehreren Werten sind ebenfalls Listen. Daher ist das Durchlaufen von Listen die Aufgabe von lapply. Die obige Zuweisung erstellt eine Reihe von Listen, in die die Funktion data.frame.[<-erfolgreich wieder in den Datenrahmen eingefügt werden soll.df

Eine andere Strategie wäre, nur die Spalten zu konvertieren, in denen die Anzahl der eindeutigen Elemente unter einem bestimmten Kriterium liegt, beispielsweise weniger als das Protokoll der Anzahl der Zeilen als Beispiel:

cols.to.factor <- sapply( df, function(col) length(unique(col)) < log10(length(col)) )
df[ cols.to.factor] <- lapply(df[ cols.to.factor] , factor)

Dies ist eine sehr schöne Lösung! Es kann auch mit Spaltennummern arbeiten, was besonders nützlich sein kann, wenn Sie viele, aber nicht alle ändern möchten. ZB col_nums <- c (1, 6, 7: 9, 21:23, 27:28, 30:31, 39, 49:55, 57), dann df [, col_nums] <- lapply (df [, col_nums] , Faktor).
WGray

Vorsichtsmaßnahme: Die erste Lösung funktioniert nicht, wenn length(col_names)==1. In diesem Fall df[,col_names]wird automatisch ein Vektor anstelle einer Liste mit der Länge 1 herabgestuft und lapplyversucht dann, über jeden Eintrag und nicht über die gesamte Spalte zu arbeiten. Dies kann durch Verwendung verhindert werden df[,col_names,drop=FALSE].
P Schnell

Das ist ein guter Punkt. Der andere Aufruf, der den Listenstatus beibehalten würde, ist die Verwendung df[col_names].
IRTFM

27

Sie können dplyr::mutate_if()alle Zeichenspalten konvertieren oder dplyr::mutate_at()benannte Zeichenspalten in Faktoren auswählen:

library(dplyr)

# all character columns to factor:
df <- mutate_if(df, is.character, as.factor)

# select character columns 'char1', 'char2', etc. to factor:
df <- mutate_at(df, vars(char1, char2), as.factor)

18

Wenn Sie alle Zeichenvariablen in Ihrem data.frame in Faktoren ändern möchten, nachdem Sie Ihre Daten bereits geladen haben, können Sie dies folgendermaßen in einen data.frame mit dem Namen dat:

character_vars <- lapply(dat, class) == "character"
dat[, character_vars] <- lapply(dat[, character_vars], as.factor)

Dadurch wird ein Vektor erstellt, der angibt, welche Spalten zur Klasse gehören character, und dann as.factorauf diese Spalten angewendet.

Beispieldaten:

dat <- data.frame(var1 = c("a", "b"),
                  var2 = c("hi", "low"),
                  var3 = c(0, 0.1),
                  stringsAsFactors = FALSE
                  )

Die vollständige Konvertierung jeder Zeichenvariablen in einen Faktor erfolgt normalerweise beim Einlesen von Daten, z. B. mit stringsAsFactors = TRUE. Dies ist jedoch nützlich, wenn Sie beispielsweise Daten read_excel()aus dem readxlPaket eingelesen haben und ein zufälliges Gesamtstrukturmodell trainieren möchten, das nicht akzeptiert wird Zeichenvariablen.
Sam Firke

13

Eine andere kurze Möglichkeit, die Sie verwenden können, ist eine Pipe ( %<>%) aus dem magrittr- Paket. Es konvertiert die Zeichenspalte mycolumn in einen Faktor.

library(magrittr)

mydf$mycolumn %<>% factor

Bitte bearbeiten Sie mit weiteren Informationen. Nur-Code- und "Versuch dies" -Antworten werden nicht empfohlen, da sie keinen durchsuchbaren Inhalt enthalten und nicht erklären, warum jemand "dies versuchen" sollte. Wir bemühen uns hier, eine Ressource für Wissen zu sein.
Brian Tompsett -

pls wenn ich es nicht für alle Spalten meines df verwenden möchte?
Mostafa

5

Ich mache es mit einer Funktion. In diesem Fall werde ich nur Zeichenvariablen in Faktoren umwandeln:

for (i in 1:ncol(data)){
    if(is.character(data[,i])){
        data[,i]=factor(data[,i])
    }
}

Ich glaube, Sie brauchen doppelte Klammern, um die Spalte tatsächlich zu extrahieren und in einen Faktor zu ändern, z. B.[[i]]
RTrain3k
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.