2013-10-02 35 views
6

我是R的新手。如果这个问题有了明显的答案,但我一直无法找到解决方案,请原谅我。我有SAS经验,可能只是以错误的方式思考这个问题。如何通过一个因子子集数据框并为每个子集重复一个绘图?

我有一个数据集,包含数百个科目的重复测量,每个科目在不同年龄段都有多个测量。每个主题由ID变量标识。我想按照AGE为每个单独的主题(ID)绘制每个测量值(让我们说身体重量)。

我用GGPLOT2做这样的事情:

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

这非常适用于少数科目,但不会对整个数据集工作。

我也试过这样的事情:

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

这也适用于少数科目,但无法读取数百个科目。

我试着用这样的代码子集:

temp <- split(dataset,dataset$ID) 

,但我不知道如何使用所产生的数据集工作。或者也许有一种方法可以简单地调整facet_wrap,以便创建单个图块?

谢谢!

+1

灿你有点澄清你的问题?您是否尝试为多个ID创建方面图,仅针对整个数据集中的一部分ID? – joran

+1

你尝试过facet_wrap吗? “你的意思是”也许有一种方法可以简单地调整facet_wrap,以便创建单独的地块?并且你有多少个ID?请给出一些可重复的例子吗? – Ananta

+0

对不起,我没试过。 facet_wrap但我有太多的主题(> 700),所以输出是无法读取的。我不确定是否有方法将数据子集,以便可以创建单独的facet_plots,每个小区只有12-16个人? – Matt

回答

18

因为要分裂的数据集,并为每个情节因此,我会使用plyr软件包中的一个拆分应用返回工具来处理此问题。

以下是使用mtcars数据集的玩具示例。我首先创建该图并将其命名为p,然后使用dlply将数据集按一个因子分解并返回每个级别的图。我利用ggplot2中的%+%来替换图中的data.frame。

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

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

这将一个接一个地返回所有图。如果您命名结果列表对象,则您也可以一次调用一个图。

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

编辑

我开始思考把一个标题基于的因素,这似乎将是有益的每个地块。

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

编辑2

这里是保存这些单个文档中的一种方式,每页一个情节。这与名为plots的地块一起工作。它将它们全部保存到一个文档,每页一个图。我没有更改pdf中的任何默认值,但您肯定可以探索可以进行的更改。

pdf() 
plots 
dev.off() 

更新使用的软件包dplyr,而不是plyr。这在do中完成,并且输出将具有一个包含所有图作为列表的命名列。

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> 

要查看R中的图,只需询问包含图的列。

plots$plots 

,并保存为

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

有趣 - –

+0

谢谢!我设法让它工作,我喜欢我可以显示或保存列表中的一部分图(例如,图[1:10]), ,plot [200:210]等)。我仍然无法将这些文件保存到代码中的文件中,但至少可以获得我现在需要的内容。 – Matt

+0

我做了一个编辑以显示一种方法将所有图表保存到一个文档中 – aosmith

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

哪里X是您的子集化的数据

请记住,您可能必须明确printggplot对象(print(ggplot(X, ..))

3

几年前一个PDF,我想要做类似的东西 - 对于情节的人生轨迹〜2500倍的参与者每1-7测量。我做到了这样,使用plyrggplot2

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"))) 

}) 

有点慢,但它的工作。如果你想获得所有参与者的轨迹感积于一身(如您的第二个例子 - 又名意大利面条图),你可以调整线条的透明度(忘了着色他们,虽然):

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

我问了一个有点类似的问题,曾经](http://stackoverflow.com/questions/1352863/getting-foreach-and-ggplot2-to-get-along)。 'plyr'是一种更好的方式,我认为... –

+0

感谢您的建议。你的第二个想法工作得很好,并且是一个有趣的方式,将所有主题的数据绘制成一个数字。我认为你的第一个想法是我正在寻找的,但是我不能让你的代码在没有错误的情况下运行。不知道我做错了什么。 – Matt

+1

@Matt Parker,这是保存每个情节的好方法。不过,我的代码也收到了错误信息。它必须处理'file.path'行。如果我将它改为'file.path(paste0(“plots”,x $ participant_id,“.png”)'这对我有用。 – aosmith

相关问题