Come modificare i dati tra formati ampi e lunghi in R? [chiuso]


32

Puoi avere dati in formato largo o lungo. Questa è una cosa abbastanza importante, poiché i metodi utilizzabili sono diversi, a seconda del formato. So che devi lavorare con melt()e cast()dal pacchetto reshape, ma sembra che alcune cose non capisco.

Qualcuno può darmi una breve panoramica di come si fa?


Fornisci l'esempio di ciò che desideri ottenere. Cosa non ottieni esattamente?
mpiktas,

3
Ecco il mio post sul blog con un esempio dell'uso di melte cast. La conversione dal formato largo a quello lungo viene eseguita in una sola fase. Non c'è davvero niente di più speciale.
mpiktas,

Benvenuti nelle statistiche. Potresti trovare utile includere un piccolo set di dati riproducibile nella tua domanda per spiegare cosa vuoi. Leggi sigmafield.org/2011/01/18/… per ulteriori informazioni.
PaulHurleyuk,

Vedi questa domanda SO per molti modi per farlo.
Axeman

Risposte:


26

Esistono diverse risorse sul sito Web di Hadley Wickham per il pacchetto (ora chiamato reshape2), incluso un collegamento a un documento sul pacchetto nel Journal of Statistical Software.

Ecco un breve esempio dall'articolo:

> require(reshape2)
Loading required package: reshape2
> data(smiths)
> smiths
     subject time age weight height
1 John Smith    1  33     90   1.87
2 Mary Smith    1  NA     NA   1.54

Notiamo che i dati sono in formato ampio. Per passare alla forma lunga, facciamo il smithsframe di dati fuso :

> melt(smiths)
Using subject as id variables
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Nota come ho melt()scelto una delle variabili come id, ma possiamo indicare esplicitamente quale utilizzare tramite argomento 'id':

> melt(smiths, id = "subject")
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Ecco un altro esempio da ?cast:

#Air quality example
names(airquality) <- tolower(names(airquality))
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)

Se memorizziamo il frame di dati fuso, possiamo eseguire il cast in altre forme. Nella nuova versione di reshape(chiamato reshape2) ci sono funzioni acast()che dcast()restituiscono rispettivamente un risultato simile a un array (array, matrice, vettore) o un frame di dati. Queste funzioni assumono anche una funzione di aggregazione (ad esempio mean()) per fornire riepiloghi di dati in forma fusa. Ad esempio, seguendo l'esempio di qualità dell'aria sopra riportato, possiamo generare, in forma ampia, valori medi mensili per le variabili nel set di dati:

> dcast(aqm, month ~ variable, mean)
  month    ozone  solar.r      wind     temp
1     5 23.61538 181.2963 11.622581 65.54839
2     6 29.44444 190.1667 10.266667 79.10000
3     7 59.11538 216.4839  8.941935 83.90323
4     8 59.96154 171.8571  8.793548 83.96774
5     9 31.44828 167.4333 10.180000 76.90000

In realtà ci sono solo due funzioni principali in reshape2: melt()e the acast()e dcast()pairing. Guarda gli esempi nelle pagine di aiuto per queste due funzioni, vedi il sito Web di Hadley (link sopra) e guarda il documento che ho citato. Questo dovrebbe iniziare.

Potresti anche esaminare il plyrpacchetto di Hadley che fa cose simili reshape2ma è progettato per fare molto di più.


dcast(aqm, month ~ variable), cosa farebbe senza la funzione di aggregazione?
Qed

@CravingSpirit restituirebbe il numero di osservazioni per ciascuna variabile. Leggi ?dcastchi ti avrebbe detto questo (vedi i dettagli per l'argomento fun.aggregate).
Ripristina Monica - G. Simpson,

8
  • Quick-R ha un semplice esempio dell'uso del pacchetto reshape

  • Vedi anche ?reshape( LINK ) per il modo Base R di spostarsi tra formato largo e lungo.


7

Non devi usare melte cast.

Il rimodellamento dei dati può essere fatto in molti modi. Nel tuo esempio particolare sulla tua citazione usare recastcon aggregateera ridondante perché aggregateil compito va bene tutto da solo.

aggregate(cbind(LPMVTUZ, LPMVTVC, LPMVTXC) ~ year, dtm, sum)
# or even briefer by first removing the columns you don't want to use
aggregate(. ~ year, dtm[,-2], sum)

Mi piace come, nel tuo post sul blog, spieghi cosa meltsta facendo. Pochissime persone lo capiscono e una volta che lo vedi diventa più facile vedere come castfunziona e come potresti scrivere le tue funzioni se lo desideri.



2

Solo notando che qui non c'è alcun riferimento ai metodi di rimodellamento più efficienti ed estesi data.table, quindi sto postando senza ulteriori commenti l'eccellente risposta di Zach / Arun su StackOverflow per una domanda simile:

https://stackoverflow.com/questions/6902087/proper-fastest-way-to-reshape-a-data-table/6913151#6913151

E in particolare c'è la meravigliosa vignetta sulla data.tablepagina GitHub:

https://github.com/Rdatatable/data.table/wiki/Getting-started

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.