2010-03-08 11 views
12

zu konvertieren Ich habe einen Datenrahmen, wo eine bestimmte Spalte eine Reihe von bestimmten Werten (sagen wir 1, 2, ..., 23) hat. Was ich tun möchte, ist, von diesem Layout zu demjenigen zu konvertieren, wo der Rahmen zusätzliche 23 (in diesem Fall) Spalten hätte, von denen jede einen der Faktorwerte darstellt. Die Daten in diesen Spalten wären booleans anzeigt, ob eine bestimmte Zeile einen Faktorwert gegeben hatte ... ein spezielles Beispiel zeigen:Reshape Datenrahmen, um Faktoren in Spalten in R

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> 

Wunschformat:

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 damit, es in einer Schleife zu machen, aber ich hoffte, dass es einen besseren Weg geben würde. Bisher reshape() ergab nicht das gewünschte Ergebnis. Hilfe wäre sehr willkommen.

Antwort

14

Ich würde versuchen, eine andere Spalte namens "Wert" zu binden und value = TRUE setzen.

df <- data.frame(cbind(1:10, 2:11, 1:3)) 
colnames(df) <- c("ID","DATE","SECTOR") 
df <- data.frame(df, value=TRUE) 

tun dann ein reshape:

reshape(df, idvar=c("ID","DATE"), timevar="SECTOR", direction="wide") 

Das Problem bei der Verwendung der reshape Funktion ist, dass die Standardeinstellung für fehlende Werte NA (in diesem Fall müssen Sie durchlaufen und ersetzen sie durch FALSCH) .

Ansonsten können Sie cast aus dem reshape Paket (see this question for an example) verwenden, und legen Sie die Standardeinstellung 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 
+2

Danke. Ich hätte darüber nachdenken sollen, eine Wertespalte zu erstellen. Interessanterweise benötigt die Value Column/Reshape-Methode 1,4 Sekunden bei 9.500 Zeilen mit 26 Faktorstufen, während die iterative Methode (über Ebenen) nur 0,6 Sekunden benötigt. –

+3

Lassen Sie sich nicht von diesen Funktionen austricksen: Die 'Umform'-Funktion selbst iteriert, wenn Sie sie betrachten. Aber es macht viel mehr als das, was die Gesamtzeit verlängern wird. Dinge wie "Umgestaltung" sollen nicht besser funktionieren; Sie dienen nur dazu, die Datenmanipulation zu vereinfachen. – Shane

2

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) 
Verwandte Themen