Ich habe einige Ergebnisse, die ich in einen Datenrahmen eingegeben habe. Ich habe einige Faktorspalten und viele numerische Spalten. Ich kann die numerischen Spalten leicht in numerische mit Indexierung umwandeln, wie in der Antwort auf this Frage.Konvertieren von Datenrahmenspalten in Faktor mit Indizierung
#create example data
df = data.frame(replicate(1000,sample(1:10,1000,rep=TRUE)))
df$X1 = LETTERS[df$X1]
df$X2 = LETTERS[df$X2]
df$X3 = LETTERS[df$X3]
df[-1] <- sapply(df[-1], function(x) ifelse(runif(length(x)) < 0.1, NA, x))
#find columns that are factors
factornames = c("X1", "X2", "X3")
factorfilt = names(df) %in% factornames
#convert non-factor columns to numeric
df[, !factorfilt] = as.numeric(as.character(unlist(df[, !factorfilt])))
Aber wenn ich das gleiche für meinen Faktor Spalten tun will, kann ich nicht die gleiche Indizierung an der Arbeit:
#convert factor columns to factor
df[, factorfilt] = as.factor(as.character(unlist(df[, factorfilt])))
class(df$X1)
[1] "character"
df[, factorfilt] = as.factor(as.character(df[, factorfilt]))
class(df$X1)
[1] "character"
df[, factorfilt] = as.factor(unlist(df[, factorfilt]))
class(df$X1)
[1] "character"
df[, factorfilt] = as.factor(df[, factorfilt])
Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?
All diese Rückkehr "character"
wenn ich class(df$X1)
rufen, während, wenn ich laufe df$X1= as.factor(df$X1)
gibt es "factor"
zurück.
Warum funktioniert die Indizierung auf diese Weise nicht, wenn ich as.factor
rufe, aber wenn ich rufe as.numeric
?
Der 'as.factor' oder' as.character' usw. funktioniert auf einem 'vector' und nicht auf' dat.frame'. Sie müssen die Spalten durchlaufen und dann 'factor' machen. – akrun
Ist das nicht der Grund, warum 'unlist' da drin ist? – Leo
Nach dem Kommentar von akrun, benutze 'lapply', um durch die ausgewählten Spalten zu laufen und den Zwang auszuführen:' df [, faktorfilz] <- lapply (df [, faktorfilz], as.factor) '. – lmo