Umformen Datenrahmen Faktoren in Spalten umwandeln in R
Frage
Ich habe einen Datenrahmen, wo eine bestimmte Spalte einen Satz von spezifischen Werte hat (sagen wir mal, 1, 2, ..., 23). Was würde Ich mag zu tun, aus diesem Layout zu dem konvertieren, wobei der Rahmen zusätzliche 23 (in diesem Fall) Spalten haben würde, von denen jeder einen der Faktorwerte darstellt. Die Daten in diesen Spalten würden booleans sein, das anzeigt, ob eine bestimmte Zeile einen bestimmten Faktor Wert hatte ... ein spezielles Beispiel zeigen:
Quelle Rahmen:
ID DATE SECTOR
123 2008-01-01 1
456 2008-01-01 3
789 2008-01-02 5
... <more records with SECTOR values from 1 to 5>
Gewünschtes Format:
ID DATE SECTOR.1 SECTOR.2 SECTOR.3 SECTOR.4 SECTOR.5
123 2008-01-01 T F F F F
456 2008-01-01 F F T F F
789 2008-01-02 F F F F T
Ich habe kein Problem es in einer Schleife zu tun, aber ich hoffte, es würde ein besserer Weg geben. Bisher reshape()
hat nicht das gewünschte Ergebnis zu erzielen. Hilfe würde sehr geschätzt werden.
Lösung
Ich würde versuchen, eine andere Spalte zu binden als „Wert“ und setzen value = TRUE
.
df <- data.frame(cbind(1:10, 2:11, 1:3))
colnames(df) <- c("ID","DATE","SECTOR")
df <- data.frame(df, value=TRUE)
Sie dann eine reshape:
reshape(df, idvar=c("ID","DATE"), timevar="SECTOR", direction="wide")
Das Problem der reshape
Funktion bei der Verwendung ist, dass die Standardeinstellung für fehlende Werte NA (in diesem Fall werden Sie sie mit FALSCH müssen durchlaufen und ersetzen).
Ansonsten können Sie cast
aus dem reshape
Paket ( sehen diese Frage für ein Beispiel verwenden ), und stellen Sie den Standard FALSE
.
df.wide <- cast(df, ID + DATE ~ SECTOR, fill=FALSE)
> df.wide
ID DATE 1 2 3
1 1 2 TRUE FALSE FALSE
2 2 3 FALSE TRUE FALSE
3 3 4 FALSE FALSE TRUE
4 4 5 TRUE FALSE FALSE
5 5 6 FALSE TRUE FALSE
6 6 7 FALSE FALSE TRUE
7 7 8 TRUE FALSE FALSE
8 8 9 FALSE TRUE FALSE
9 9 10 FALSE FALSE TRUE
10 10 11 TRUE FALSE FALSE
Andere Tipps
Hier ist ein weiterer Ansatz xtabs
verwendet, die nicht schneller sein kann oder (wenn jemand versuchen würde, und lassen Sie mich wissen):
df <- data.frame(cbind(1:12, 2:13, 1:3))
colnames(df) <- c("ID","DATE","SECTOR")
foo <- xtabs(~ paste(ID, DATE) + SECTOR, df)
cbind(t(matrix(as.numeric(unlist(strsplit(rownames(foo), " "))), nrow=2)), foo)