2009-07-23 14 views
15

Ho dati che escono da un DB in modo normalizzato con un campo per anno, stato e valore.Converti dati da più righe a più colonne

Mi piacerebbe fare analisi sui dati e aver bisogno di formattarli dove ogni anno è un campo e non un record. Vorrei i dati in cui ogni record è uno stato e poi c'è un campo per ogni anno e ogni il valore per questi campi è il valore per quell'anno e quello stato.

Esiste un comando per farlo?

Così ho:

State Year Value 
    KY 1998  56 
    KY 1997  78 
    IL 1998  48 
    IL 1997  72 

e voglio:

State 1997_value 1998_value 
    KY   78   56 
    IL   72   48 

risposta

18

si desidera utilizzare la funzione reshape().

reshape(data, idvar="State", timevar="Year", direction="wide") 
5

Un'altra opzione è quella di utilizzare il pacchetto Reshape , creato dalla inimitabile Hadley Wickham:

library(reshape) 

tuna<-melt(data,id.vars=c("State","Year")) 

cast(tuna,State~Year~variable) 
2

È anche possibile combinare le linee di fondere in una chiamata alla funzione rifusione.

ds <- data.frame(State = c("KY", "KY", "IL", "IL"), 
Year = c(1998, 1997, 1998, 1997), 
Value = c(56, 78, 48, 72)) 

library(reshape) 
recast(ds, State ~ Year, id.var = c("State", "Year")) 
+0

In questo caso, i dati sono già in forma fusa, quindi è possibile saltare la fase di fusione. – hadley