2016-01-01 9 views

Antwort

9

Konvertierung von factor zu numeric ergibt die ganzzahligen Werte. Wenn die factor Spalten jedoch Ebenen haben, die als c('b', 'a', 'c', 'd') oder c('c', 'b', 'a') angegeben sind, werden die Ganzzahlwerte in dieser Reihenfolge angezeigt. Nur um zu vermeiden, dass wir die levels durch die factor Aufruf erneut angeben (sicherer)

df1[] <- lapply(df1, function(x) 
       as.numeric(factor(x, levels=letters[1:3]))) 

Wenn wir data.table verwenden, wäre eine Option sein set zu verwenden. Es wäre effizienter für große Datensätze. Die Konvertierung in matrix kann zu Speicherproblemen führen.

library(data.table) 
setDT(df1) 
for(j in seq_along(df1)){ 
set(df1, i=NULL, j=j, 
    value= as.numeric(factor(df1[[j]], levels= letters[1:3]))) 
} 
+0

Ich bin neugierig: Wie DF1 [] <- ... Differ von df1 <-... Ich denke, sie zum gleichen Ergebnis führen am Ende aber vielleicht auf verschiedenen Wegen? – atiretoo

+0

@atiretoo Er behält die Struktur wie im ursprünglichen Datensatz bei. – akrun

+1

Aha! Danke ja insbesondere df1 wird immer noch ein Datenrahmen sein – atiretoo

11

Ich würde versuchen:

> mydf[] <- as.numeric(factor(as.matrix(mydf))) 
> mydf 
    V1 V2 V3 
1 1 2 3 
2 3 2 1 
3 3 2 3 
4 2 2 1 
+0

Könnten Sie erklären, warum ein einfaches 'apply (mydf, 2, as.numeric)' nicht funktioniert? –

+0

@AlbertMasclans, lesen Sie die erste Zeile des Abschnitts "Details" für "anwenden". 'apply' macht zuerst' as.matrix' auf dem 'dat.frame' (was alles in' Zeichen 'konvertiert). Wenn Sie dann direkt 'as.numeric' für einen' Zeichen'-Vektor verwenden, erhalten Sie eine Reihe von 'NA'-Werten. – A5C1D2H2I1M1N2O1R2T1

5

Dieser Ansatz zu Anandas ähnlich ist, verwendet aber unlist() statt factor(as.matrix()). Da alle Ihre Spalten bereits Faktoren sind, werden unlist() sie in einem Faktorvektor mit den entsprechenden Ebenen kombinieren.

Lassen Sie uns einen Blick darauf werfen, was passiert, wenn wir unlist() Ihren Datenrahmen.

unlist(df, use.names = FALSE) 
# [1] a c c b b b b b c a c a 
# Levels: a b c 

Jetzt können wir einfach as.integer() (oder c()) auf dem obigen Code ausgeführt werden, da die ganzzahligen Werte der Faktoren, die Ihre gewünschte Abbildung entsprechen. Und so wertet der folgende Code Ihren gesamten Datenrahmen auf.

df[] <- as.integer(unlist(df, use.names = FALSE)) 
## note that you can also just drop the factor class with c() 
## df[] <- c(unlist(df, use.names = FALSE)) 
df 
# V1 V2 V3 
# 1 1 2 3 
# 2 3 2 1 
# 3 3 2 3 
# 4 2 2 1 

Hinweis:use.names = FALSE ist nicht erforderlich. Durch das Löschen des Namensattributs wird dieser Prozess jedoch effizienter.

Daten:

df <- structure(list(V1 = structure(c(1L, 3L, 3L, 2L), .Label = c("a", 
"b", "c"), class = "factor"), V2 = structure(c(1L, 1L, 1L, 1L 
), .Label = "b", class = "factor"), V3 = structure(c(2L, 1L, 
2L, 1L), .Label = c("a", "c"), class = "factor")), .Names = c("V1", 
"V2", "V3"), class = "data.frame", row.names = c(NA, -4L)) 
Verwandte Themen