¿Cómo subconjunto un dataframe por un factor y repetir un diagtwig para cada subconjunto?

Soy nuevo en R. Perdóname si esto si esta pregunta tiene una respuesta obvia pero no he podido encontrar una solución. Tengo experiencia con SAS y puedo estar pensando en este problema de la manera incorrecta.

Tengo un conjunto de datos con medidas repetidas de cientos de sujetos y cada sujeto tiene múltiples medidas en diferentes edades. Cada sujeto está identificado por una variable de identificación. Me gustaría hacer una gráfica de cada medida (digamos cuerpo PESO) por EDAD para cada sujeto individual (ID).

He usado ggplot2 para hacer algo como esto:

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

Esto funciona bien para un pequeño número de sujetos, pero no funcionará para todo el conjunto de datos.

También intenté algo como esto:

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

Esto también funciona para un pequeño número de sujetos, pero no se puede leer con cientos de sujetos.

Intenté subconjunto usando un código como este:

 temp <- split(dataset,dataset$ID) 

pero no estoy seguro de cómo trabajar con el conjunto de datos resultante. ¿O tal vez hay una forma de simplemente ajustar el facet_wrap para que se creen gráficos individuales?

¡Gracias!

Como desea dividir el conjunto de datos y hacer un gráfico para cada nivel de un factor, lo abordaría con una de las herramientas split-apply-return del paquete plyr .

Aquí hay un ejemplo de juguete usando el conjunto de datos mtcars . Primero creo el diagtwig y lo llamo p , luego uso dlply para dividir el conjunto de datos por un factor y devolver un diagtwig para cada nivel. Aprovecho %+% de ggplot2 para reemplazar data.frame en un diagtwig.

 p = ggplot(data = mtcars, aes(x = wt, y = mpg)) + geom_line() require(plyr) dlply(mtcars, .(cyl), function(x) p %+% x) 

Esto devuelve todas las ttwigs, una tras otra. Si nombra el objeto de la lista resultante, también puede llamar un diagtwig a la vez.

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

Editar

Empecé a pensar en poner un título en cada argumento basado en el factor, que parece que sería útil.

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

Editar 2

Aquí hay una manera de guardar estos en un solo documento, un diagtwig por página. Esto está trabajando con la lista de plots llamadas plots . Los guarda a todos en un documento, un diagtwig por página. No cambié ninguno de los valores predeterminados en pdf , pero ciertamente puede explorar los cambios que puede realizar.

 pdf() plots dev.off() 

Se actualizó para usar el paquete dplyr lugar de plyr . Esto se hace en do , y la salida tendrá una columna con nombre que contiene todos los gráficos como una lista.

 library(dplyr) plots = mtcars %>% group_by(cyl) %>% do(plots = p %+% . + facet_wrap(~cyl)) Source: local data frame [3 x 2] Groups:  cyl plots 1 4  2 6  3 8  

Para ver las plots en R, solo pregunta por la columna que contiene las plots.

 plots$plots 

Y para guardar como un pdf

 pdf() plots$plots dev.off() 

Hace algunos años, quería hacer algo similar: trazar trayectorias individuales para ~ 2500 participantes con 1-7 mediciones cada uno. Lo hice así, usando plyr y 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 poco lento, pero funcionó. Si desea tener una idea de las trayectorias de todos los participantes en una ttwig (como su segundo ejemplo, también conocido como la ttwig de espagueti), puede ajustar la transparencia de las líneas (sin embargo, olviden colorearlas):

 ggplot(data = dat, aes(x = phase, y = result, group = participant_id)) + geom_line(alpha = 0.3) 
 lapply(temp, function(X) ggplot(X, ...)) 

Donde X es tu información subconjuntada

Tenga en cuenta que puede tener que print explícitamente el objeto ggplot ( print(ggplot(X, ..)) )