2010-03-08 14 views
12

Ho un frame di dati in cui una particolare colonna ha un insieme di valori specifici (diciamo, 1, 2, ..., 23). Quello che mi piacerebbe fare è convertire da questo layout a quello in cui il frame avrebbe colonne extra 23 (in questo caso), ognuna delle quali rappresenta uno dei valori dei fattori. I dati in queste colonne sarebbero booleani che indicano se una fila particolare aveva un dato valore del fattore ... Per mostrare un esempio specifico: telaioRisagoma frame dati per convertire i fattori in colonne in R

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 problemi a farlo in un ciclo ma speravo che ci sarebbe stato un modo migliore. Finora reshape() non ha prodotto il risultato desiderato. L'aiuto sarebbe molto apprezzato.

risposta

14

Vorrei provare a associare un'altra colonna denominata "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 FALSO) .

In caso contrario è possibile utilizzare cast dalla confezione reshape (see this question for an example), 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 
+2

Grazie. Avrei dovuto pensare a creare una colonna di valori. È interessante notare che l'approccio value column/reshape richiede 1,4 secondi su 9.500 righe con 26 livelli di fattore, mentre l'utilizzo dell'approccio iterativo (su livelli) richiede solo 0,6 secondi. –

+3

Non essere ingannato da queste funzioni: la funzione 'reshape' stessa esegue l'iterazione se la guardi. Ma fa molto altro oltre a quello, che si aggiungerà al tempo complessivo. Cose come 'rimodella 'non sono destinate a dare risultati migliori; sono lì solo per semplificare la manipolazione dei dati. – Shane

2

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) 
Problemi correlati