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.

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top