Rimodellare frame di dati per convertire fattori in colonne R
Domanda
Ho un frame di dati in cui una particolare colonna ha un insieme di valori specifici (diciamo, 1, 2, ..., 23). Cosa vorrei fare è convertire da questo layout a quello, in cui il telaio avrebbe colonne aggiuntive 23 (in questo caso), ciascuno dei quali rappresenta uno dei valori del fattore. I dati in queste colonne sarebbero booleani che indicano se una fila particolare aveva un dato valore del fattore ... Per mostrare un esempio specifico:
telaio Fonte:
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>
formato desiderato:
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
Non ho alcun problema a farlo in un ciclo ma speravo ci sarebbe un modo migliore. Finora reshape()
non ha dato il risultato desiderato. Aiuto sarebbe molto apprezzato.
Soluzione
Vorrei provare a legare un'altra colonna chiamata "valore" e impostare value = TRUE
.
df <- data.frame(cbind(1:10, 2:11, 1:3))
colnames(df) <- c("ID","DATE","SECTOR")
df <- data.frame(df, value=TRUE)
Poi fare un reshape:
reshape(df, idvar=c("ID","DATE"), timevar="SECTOR", direction="wide")
Il problema con l'utilizzo della funzione reshape
è che il default per i valori mancanti è NA (nel qual caso si dovrà scorrere e sostituirli con FALSE).
In caso contrario, è possibile utilizzare cast
dalla confezione reshape
( vedi questa domanda per un esempio ), e impostare il valore predefinito per 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
Altri suggerimenti
Ecco un altro approccio con xtabs
che può o non può essere più veloce (se qualcuno avrebbe cercato e fammi sapere):
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)