0

我在 R 中有一个具有这种格式的大型数据框:

"SubjID"    "HR"    "IBI"   "Stimulus"  "Status"
"S1"    75.98   790 1   1
"S1"    75.95   791 1   2
"S1"    65.7    918 1   3
"S1"    59.63   100 1   4
"S1"    59.44   101 1   5
"S1"    59.62   101 2   1
"S1"    63.85   943 2   2
"S1"    60.75   992 2   3
"S1"    59.62   101 2   4
"S1"    61.68   974 2   5
"S2"    65.21   921 1   1
"S2"    59.23   101 1   2
"S2"    61.23   979 1   3
"S2"    70.8    849 1   4
"S2"    74.21   809 1   4

我想为状态列的每个值绘制“HR”列的平均值。

我编写了以下 R 代码,在其中创建数据子集(通过“状态”的不同值)并绘制它:

numberOfSeconds <- 8;

    for(stimNumber in 1:40) {

    stimulus2plot <- subset(resampledDataFile, Stimulus == stimNumber & Status <= numberOfSeconds, select=c(SubjID, HR, IBI, Stimulus, Status))

    plot(stimulus2plot$HR~stimulus2plot$Status, xlab="",ylab="")
    lines(stimulus2plot$HR~stimulus2plot$Status, xlab="",ylab="")

    }

从而获得类似于以下的图:在此处输入图像描述

每个“刺激”都有一个情节。在每个图的 X 轴上,我有“状态”列,在 YI 上,每个“SubjID”都有一个“HR”值。差不多好了...

但是,我最终想要获得的是每个 X 值都有一个 Y 数据点。即 Y 应该是平均值(HR 列的平均值),类似于下图:

在此处输入图像描述

如何做到这一点?如果每个数据点中的标准偏差也显示为误差线,那就太好了。

在此先感谢您的帮助。

4

4 回答 4

2

您可以做的最简单的事情是首先预先计算值,然后绘制它们。我会使用ddply这种分析:

library(plyr)
res = ddply(df, .(Status), summarise, mn = mean(HR))

并使用 ggplot2 绘制它:

ggplot(res, aes(x = Status, y = mn)) + geom_line() + geom_point()
于 2013-03-12T11:53:50.733 回答
2

最简单的方法是tapply(). 如果你data.framedata

means <- with(data, tapply(HR, Status, mean))
plot(means, type="l")

计算和绘制误差线也很容易:

serr <- with(data, tapply(HR, Status, function(x)sd(x)/sqrt(length(x))))
plot(means, type="o", ylim=c(50,80))
sapply(1:length(serr), function(i) lines(rep(i,2), c(means[i]+serr[i], means[i]-serr[i])))
于 2013-03-12T11:54:46.617 回答
2

为了让它最接近你想要的:

library(ggplot2)
library(plyr)
df.summary <- ddply(df, .(Stimulus, Status), summarise,
                    HR.mean = mean(HR),
                    HR.sd = sd(HR))
ggplot(df.summary, aes(Status, HR.mean)) + geom_path() + geom_point() + 
  geom_errorbar(aes(ymin=HR.mean-HR.sd, ymax=HR.mean+HR.sd), width=0.25) +facet_wrap(~Stimulus) 

在此处输入图像描述

于 2013-03-12T12:03:08.323 回答
0

您可以使用以下假数据示例作为指南,在 ggplot2 中完全执行此操作:

DF <- data.frame(stimulus = factor(rep(paste("Stimulus", seq(4)), each = 40)),
                 subject = factor(rep(seq(20), each = 8)),
                 time = rep(seq(8), 20),
                 resp = rnorm(160, 50, 10))
# spaghetti plots
ggplot(DF, aes(x = time, y = resp, group = subject)) +
   geom_line() +
   facet_wrap(~ stimulus, ncol = 1)
# plot of time averages by stimulus
ggplot(DF, aes(x = time, y = resp)) +
   stat_summary(fun.y = mean, geom = "line", group = 1) +
   stat_summary(fun.y = mean, geom = "point", group = 1, shape = 1) +
   facet_wrap(~ stimulus, ncol = 1)
于 2013-03-14T08:53:54.423 回答