如何通过一个因子子集数据框并为每个子集重复一个绘图?
我是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个测量值的单个轨迹。 我这样做,使用plyr
和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"))) })
有点慢,但它的工作。 如果你想了解所有参与者在一个情节中的轨迹(就像你的第二个例子,也就是意大利式细面条一样),你可以调整行的透明度(不要着色它们):
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有趣的图表的子集来显示结果。