Ich habe einen R-Datenrahmen, der einen Faktor enthält, den ich "erweitern" möchte, sodass für jede Faktorstufe eine Spalte in einem neuen Datenrahmen zugeordnet ist, die einen 1/0 Indikator enthält. Angenommen, ich habe:
df.original <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c(1,2,3,4))
Ich will:
df.desired <- data.frame(foo = c(1,1,0,0), bar=c(0,0,1,1), ham=c(1,2,3,4))
Da für bestimmte Analysen, für die Sie einen vollständig numerischen Datenrahmen benötigen (z. B. Hauptkomponentenanalyse), ich dachte, dass diese Funktion integriert sein könnte. Das Schreiben einer Funktion, um dies zu tun, sollte nicht zu schwierig sein, aber ich kann einige vorhersehen Herausforderungen in Bezug auf Spaltennamen und wenn bereits etwas vorhanden ist, würde ich das lieber nutzen.
cast
für mich.?formula
sowie überprüft?model.matrix
, aber es war unklar (könnte nur mein Mangel an Wissenstiefe in Matrixalgebra und Modellformulierung sein). Nachdem ich mehr gegraben hatte, konnte ich feststellen, dass -1 nur angibt, dass die Spalte "Intercept" nicht enthalten sein soll. Wenn Sie -1 weglassen, wird in der Ausgabe eine Intercept-Spalte mit Einsen angezeigt, wobei eine Binärspalte weggelassen wird. Sie können anhand von Zeilen sehen, welche Werte in der ausgelassenen Spalte 1 sind, wobei die Werte der anderen Spalten 0 sind. Die Dokumentation scheint kryptisch - gibt es noch eine gute Ressource?model.matrix(~., data=iris)[,-1]
naresid
die fehlenden Werte nach der Verwendung wieder eingebenna.exclude
. Ein kurzes Beispiel:tmp <- data.frame(x=factor(c('a','b','c',NA,'a'))); tmp2 <- na.exclude(tmp); tmp3 <- model.matrix( ~x-1, tmp2); tmp4 <- naresid(attr(tmp2,'na.action'), tmp3)
Wenn Ihr Datenrahmen nur aus Faktoren besteht (oder Sie an einer Teilmenge von Variablen arbeiten, die alle Faktoren sind), können Sie auch die
acm.disjonctif
Funktion aus demade4
Paket verwenden:Nicht genau der Fall, den Sie beschreiben, aber es kann auch nützlich sein ...
quelle
Ein schneller Weg mit dem
reshape2
Paket:Beachten Sie, dass dies genau die gewünschten Spaltennamen erzeugt.
quelle
ham
es sich um eine eindeutige Zeilen-ID handelt. Wennham
es sich nicht um eine eindeutige ID handelt, muss eine andere eindeutige ID verwendet werden (oder eine Dummy-ID erstellt werden) und diese anstelle von verwendet werdenham
. Das Konvertieren einer kategorialen Bezeichnung in einen binären Indikator wäre nur für eindeutige IDs sinnvoll.Wahrscheinlich ähnelt die Dummy-Variable dem, was Sie wollen. Dann ist model.matrix nützlich:
quelle
Ein verspäteter Eintrag
class.ind
aus demnnet
Paketquelle
Ich bin gerade auf diesen alten Thread gestoßen und dachte, ich würde eine Funktion hinzufügen, die ade4 verwendet, um einen Datenrahmen zu verwenden, der aus Faktoren und / oder numerischen Daten besteht, und einen Datenrahmen mit Faktoren als Dummy-Codes zurückgibt.
Lass es uns versuchen.
quelle
Hier ist ein klarerer Weg, dies zu tun. Ich verwende model.matrix, um die booleschen Dummy-Variablen zu erstellen und sie dann wieder in den ursprünglichen Datenrahmen einzufügen.
quelle
Ich brauchte eine Funktion, um Faktoren zu explodieren, die etwas flexibler ist, und habe eine basierend auf der Funktion acm.disjonctif aus dem ade4-Paket erstellt. Auf diese Weise können Sie die Explosionswerte auswählen, die in acm.disjonctif 0 und 1 sind. Es explodiert nur Faktoren, die "wenige" Ebenen haben. Numerische Spalten bleiben erhalten.
quelle