2012-05-06 11 views
7

Sono appena tornato su R da una lunga pausa di scrittura e sto avendo alcuni problemi reali a ricordare come rimodellare i dati. So che quello che voglio fare è facile, ma per qualche motivo sono stanco di stasera e mi sono confuso con sciogliere e rimodellare. Se qualcuno potesse indicarmi rapidamente la giusta direzione, sarebbe molto apprezzato.simple data.frame reshape

Ho un dataframe come tale:

person week year 
personA 6  1 
personA 22  1 
personA 41  1 
personA 42  1 
personA 1  2 
personA 23  2 
personB 8  2 
personB 9  2 
.... 
personN x  y 

voglio finire con un conteggio di eventi per anno e per persona: (in modo che possa tracciare un grafico a linea veloce per ogni persona oltre la anni)

es.

person year1 year2 
personA 4  2 
personB 0  2 

Mille grazie per la lettura.

risposta

8

avrei probabilmente usare reshape2 pacchetto e la funzione dcast poiché gestisce sia la rimodulazione e l'aggregazione in un unico passaggio:

library(reshape2) 
> dcast(person ~ year, value.var = "year", data = dat) 
Aggregation function missing: defaulting to length 
    person 1 2 
1 personA 4 2 
2 personB 0 2 
+0

Questo è grande - aveva usato rimodellare prima, ma non reshape2 - molte grazie. – user1378122

7

In questo caso, si può semplicemente utilizzare tapply:

> with(data, tapply(week, list(person=person, year=year), length)) 
     year 
person  1 2 
    personA 4 2 
    personB NA 2 

Il risultato è una matrice. Questa soluzione produce NA se ci sono celle vuote.

+0

Mi stavo chiedendo se è possibile incorporare 'NA's in questa soluzione in una settimana ... Un modo sarebbe cambiare il' NA' in settimana a qualche valore strano, ma mi stavo chiedendo se c'è un fuori la soluzione scatola ... Qualche idea? –

5

xtabs dalla base R funziona molto bene per questo problema:

dat <- read.table(text="person week year 
personA 6  1 
personA 22  1 
personA 41  1 
personA 42  1 
personA 1  2 
personA 23  2 
personB 8  2 
personB 9  2 
", header=TRUE) 
xtabs(~person+year, data=dat) 
#----------------- 
     year 
person 1 2 
    personA 4 2 
    personB 0 2 

È possibile passare la sua uscita matplot poiché restituisce un oggetto tabella/matrice:

matplot(xtabs(~person+year, data=dat)) 

L'uscita asse x su questo piccolo esempio potrebbe non essere quello che vuoi ma con più anni, potrebbe esserci un'etichettatura degli assi predefinita più soddisfacente. Oppure si potrebbe sopprimere le etichette di default x-asse con xaxt = "n" e utilizzare axis di etichettare come si desidera:

matplot( xtabs(~person+year, data=dat), xaxt="n", type="b")