2013-10-02 16 views
6

Sono nuovo di R. Perdonami se questo se questa domanda ha una risposta ovvia, ma non sono stato in grado di trovare una soluzione. Ho esperienza con SAS e potrebbe semplicemente pensare a questo problema nel modo sbagliato.Come impostare sottoinsieme un frame di dati per un fattore e ripetere un grafico per ogni sottoinsieme?

Ho un set di dati con misure ripetute da centinaia di soggetti con ciascun soggetto che ha misurazioni multiple in epoche diverse. Ogni soggetto è identificato da una variabile ID. Mi piacerebbe tracciare ogni misura (diciamo body WEIGHT) di AGE per ogni singolo soggetto (ID).

ho usato ggplot2 a fare qualcosa di simile:

ggplot(data = dataset, aes(x = AGE, y = WEIGHT)) + geom_line() + facet_wrap(~ID) 

Questo funziona bene per un piccolo numero di soggetti, ma non funziona per l'intero set di dati.

Ho anche provato qualcosa di simile:

ggplot(data=data, aes(x = AGE,y = BW, group = ID, colour = ID)) + geom_line() 

Questo funziona anche per un piccolo numero di soggetti, ma non è leggibile con centinaia di soggetti.

Ho cercato di sottoinsieme utilizzando il codice in questo modo:

temp <- split(dataset,dataset$ID) 

ma non sono sicuro di come lavorare con il set di dati risultante. O forse c'è un modo per regolare semplicemente facet_wrap in modo che vengano creati singoli grafici?

Grazie!

+1

Can chiarisci un po 'la tua domanda? Stai cercando di creare un diagramma di sfaccettatura per più ID, solo su un sottoinsieme di ID dell'intero set di dati? – joran

+1

hai provato facet_wrap? cosa intendi con "forse c'è un modo per regolare semplicemente il facet_wrap in modo che vengano creati singoli trame?" e quanti ID hai? puoi per favore dare qualche esempio riproducibile? – Ananta

+0

Ci scusiamo per non essere più chiaro. facet_wrap ma ho troppi soggetti (> 700) quindi l'output era illeggibile.Non sono sicuro se c'è un modo per suddividere i dati in modo da poter creare facet_plots separati con solo 12-16 individui per trama? – Matt

risposta

18

Perché si vuole dividere il set di dati e fare un complotto per ogni livello di un fattore, vorrei affrontare questo con uno degli strumenti split-apply-return dal pacchetto plyr.

Ecco un esempio di giocattolo che utilizza il set di dati mtcars. Prima creo la trama e la chiamo p, quindi uso dlply per dividere il set di dati per un fattore e restituire un grafico per ogni livello. Sto approfittando di %+% da ggplot2 per sostituire data.frame in un grafico.

p = ggplot(data = mtcars, aes(x = wt, y = mpg)) + 
    geom_line() 

require(plyr) 
dlply(mtcars, .(cyl), function(x) p %+% x) 

Questo restituisce tutti i grafici, uno dopo l'altro. Se si nomina l'oggetto elenco risultante, è possibile chiamare anche un grafico alla volta.

plots = dlply(mtcars, .(cyl), function(x) p %+% x) 
plots[1] 

Modifica

ho iniziato a pensare di mettere un titolo su ogni appezzamento in base al fattore, che sembra sarebbe utile.

dlply(mtcars, .(cyl), function(x) p %+% x + facet_wrap(~cyl)) 

Edit 2

Ecco un modo per salvare questi in un unico documento, una trama per pagina. Funziona con l'elenco di grafici denominato plots. Li salva tutti in un unico documento, un grafico per pagina. Non ho modificato nessuno dei valori predefiniti in pdf, ma puoi sicuramente esplorare le modifiche che puoi apportare.

pdf() 
plots 
dev.off() 

Aggiornato per usare il pacchetto dplyr invece di plyr. Questo viene fatto in do e l'output avrà una colonna denominata che contiene tutti i grafici come un elenco.

library(dplyr) 
plots = mtcars %>% 
    group_by(cyl) %>% 
    do(plots = p %+% . + facet_wrap(~cyl)) 


Source: local data frame [3 x 2] 
Groups: <by row> 

    cyl   plots 
1 4 <S3:gg, ggplot> 
2 6 <S3:gg, ggplot> 
3 8 <S3:gg, ggplot> 

Per vedere i grafici in R, basta chiedere la colonna che contiene i grafici.

plots$plots 

e salvare in formato pdf

pdf() 
plots$plots 
dev.off() 
+0

Interessante - Non avevo mai pensato di mettere i complotti in una lista prima. –

+0

Grazie! Sono riuscito a farlo funzionare. Mi piace come posso quindi visualizzare o salvare un sottoinsieme dei grafici dalla lista (ad esempio, grafici [1:10] , diagrammi [200: 210], ecc.) Ho ancora problemi a recuperarli in un file all'interno del codice, ma almeno questo mi rende ciò di cui ho bisogno per ora. – Matt

+0

Ho apportato una modifica per mostrare un modo per salvare tutti i grafici in un documento – aosmith

2
lapply(temp, function(X) ggplot(X, ...)) 

Dove X è i dati subsetted

Tenete a mente potrebbe essere necessario in modo esplicito print l'ggplot oggetto (print(ggplot(X, ..)))

3

Qualche anno fa, ho voluto fare qualcosa di simile - trama traiettorie individuali per ~ 2500 partecipanti con 1-7 misurazioni ciascuno. L'ho fatto in questo modo, utilizzando plyr e ggplot2:

library(plyr) 
library(ggplot2) 

d_ply(dat, .var = "participant_id", .fun = function(x) { 

    # Generate the desired plot 
    ggplot(x, aes(x = phase, y = result)) + 
     geom_point() + 
     geom_line() 

    # Save it to a file named after the participant 
    # Putting it in a subdirectory is prudent 
    ggsave(file.path("plots", paste0(x$participant_id, ".png"))) 

}) 

Un po 'lento, ma ha funzionato. Se si vuole ottenere un senso di traiettorie di tutti i partecipanti in una trama (come il tuo secondo esempio - alias la trama di spaghetti), è possibile modificare la trasparenza delle linee (dimenticarle colorazione, però):

ggplot(data = dat, aes(x = phase, y = result, group = participant_id)) + 
    geom_line(alpha = 0.3) 
+0

Ho chiesto [una domanda simile , una volta] (http://stackoverflow.com/questions/1352863/getting-foreach-and-ggplot2-to-get-along). 'plyr' è un modo migliore di andare, credo ... –

+0

Grazie per i suggerimenti. La tua seconda idea ha funzionato bene ed è stato un modo interessante per tracciare i dati di tutti i soggetti come una singola figura. Penso che la tua prima idea sia quella che stavo cercando, tuttavia non riesco a far funzionare il tuo codice senza errori. Non sono sicuro di cosa sto sbagliando. – Matt

+1

@ Park Parker, questo è un bel modo per salvare ogni trama. Ho anche ricevuto un messaggio di errore con il tuo codice, però. Ha a che fare con la riga 'file.path'. Se l'ho modificato in 'file.path (paste0 (" diagrammi ", x $ participant_id," .png ")" questo ha funzionato per me. – aosmith

Problemi correlati