7

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

我有一个数据集,其中包含来自数百名受试者的重复测量,每个受试者在不同年龄段都有多次测量。每个主题都由一个 ID 变量标识。我想为每个个体(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 以便创建单独的图?

谢谢!

4

3 回答 3

20

因为您想拆分数据集并为因子的每个级别绘制图表,所以我会使用plyr包中的一个拆分-应用-返回工具来解决这个问题。

这是一个使用数据集的玩具示例mtcars。我首先创建绘图并命名它p,然后使用dlply一个因子拆分数据集并返回每个级别的绘图。我正在利用%+%fromggplot2替换图中的 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()
于 2013-10-02T22:33:37.287 回答
3

几年前,我想做一些类似的事情——为大约 2500 名参与者绘制个人轨迹,每个参与者进行 1-7 次测量。我这样做了,使用plyrand 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)
于 2013-10-02T22:52:36.567 回答
2
lapply(temp, function(X) ggplot(X, ...))

X您的子集数据在哪里

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

于 2013-10-02T20:59:48.740 回答