如何通过一个因子子集数据框并为每个子集重复一个绘图?

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

我有一个来自数百个科目的重复测量的数据集,每个科目都有不同年龄的多个测量值。 每个主题由一个IDvariables标识。 我想每个单独的主题(ID)绘制每个测量(让我们说身体重量)由年龄。

我用ggplot2做这样的事情:

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

这适用于less量的主题,但不适用于整个数据集。

我也尝试过这样的事情:

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

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

我试图使用这样的代码子集:

 temp <- split(dataset,dataset$ID) 

但我不确定如何使用最终的数据集。 或者也许有一种方法可以简单地调整facet_wrap,以便创build单个图块?

谢谢!

因为你想分解数据集,并为每个因素的水平绘制一个图表,我会用plyr软件包中的一个拆分应用返回工具来解决这个plyr

这是一个使用mtcars数据集的玩具示例。 我首先创build该图并将其命名为p ,然后使用dlply将数据集按一个因子分割并返回每个级别的图。 我正在利用ggplot2%+%来replaceplot中的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

 pdf() plots$plots dev.off() 

几年前,我想要做类似的事情 – 为每个约有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) 
 lapply(temp, function(X) ggplot(X, ...)) 

X是您的子集数据

请记住,您可能必须显式地print ggplot对象( print(ggplot(X, ..))

道歉,因为这不直接回答你的问题,但如果它的关系,你正在寻找(你不一定需要图表),为什么不使用回归与交互? 就像是…

 model <- lm(weight ~ age * ID, data=data) summary(model) 

然后,您可以select有趣的图表的子集来显示结果。