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.

Rasoul
quelle
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

Tyler Rinker
quelle
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)
IRTFM
quelle
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)
sbha
quelle
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
                  )
Sam Firke
quelle
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
chrimuelle
quelle
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])
    }
}
user3397644
quelle
Ich glaube, Sie brauchen doppelte Klammern, um die Spalte tatsächlich zu extrahieren und in einen Faktor zu ändern, z. B.[[i]]
RTrain3k