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.

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top