如何通过因子对数据帧进行子集并重复每个子集的绘图?

Mat*_*att 7 split r ggplot2

我是R的新手.请原谅我,如果这个问题有明显的答案,但我找不到解决办法.我有SAS的经验,可能只是以错误的方式思考这个问题.

我有一个数据集,其中包含来自数百个受试者的重复测量,每个受试者在不同年龄段进行多次测量.每个主题由ID变量标识.我想通过AGE为每个个体(ID)绘制每个测量值(比如体重).

我用ggplot2做了这样的事情:

ggplot(data = dataset, aes(x = AGE, y = WEIGHT )) + geom_line() + facet_wrap(~ID)
Run Code Online (Sandbox Code Playgroud)

这适用于少数主题,但不适用于整个数据集.

我也尝试过这样的事情:

ggplot(data=data, aes(x = AGE,y = BW, group = ID, colour = ID)) + geom_line()
Run Code Online (Sandbox Code Playgroud)

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

我试过使用这样的代码进行子集:

temp <- split(dataset,dataset$ID)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何使用生成的数据集.或者也许有一种方法可以简单地调整facet_wrap,以便创建单独的图?

谢谢!

aos*_*ith 20

因为您想要拆分数据集并为每个级别的因子制作一个图,我将使用包中的一个split-apply-return工具来处理这个问题plyr.

这是使用mtcars数据集的玩具示例.我首先创建绘图并将其命名p,然后使用dlply按因子分割数据集并返回每个级别的绘图.我正在利用%+%from ggplot2来替换plot中的data.frame.

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

require(plyr)
dlply(mtcars, .(cyl), function(x) p %+% x)
Run Code Online (Sandbox Code Playgroud)

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

plots = dlply(mtcars, .(cyl), function(x) p %+% x)
plots[1]
Run Code Online (Sandbox Code Playgroud)

编辑

我开始考虑根据因素在每个情节上设置一个标题,这看起来很有用.

dlply(mtcars, .(cyl), function(x) p %+% x + facet_wrap(~cyl))
Run Code Online (Sandbox Code Playgroud)

编辑2

这是将这些保存在单个文档中的一种方法,每页一个图.这与名为的图表列表一起使用plots.它将它们全部保存到一个文档,每页一个图.我没有更改任何默认值pdf,但您当然可以探索可以进行的更改.

pdf()
plots
dev.off()
Run Code Online (Sandbox Code Playgroud)

更新为使用包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>
Run Code Online (Sandbox Code Playgroud)

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

plots$plots
Run Code Online (Sandbox Code Playgroud)

并保存为pdf

pdf()
plots$plots
dev.off()
Run Code Online (Sandbox Code Playgroud)