我想创建以下图:x轴从1到900表示试用编号。 y轴显示三条不同的线,具有反应时间的移动平均值。每个难度级别显示一行(Hard,Medium,Easy)。应使用facet_wrap为每个参与者显示单独的图表。
如果我使用ggplot的geom_smooth()
函数,现在一切正常。像这样:
ggplot(cw_trials_f, aes(x=trial_number, y=as.numeric(correct), col=difficulty)) +
facet_wrap(~session_id) +
geom_smooth() +
ggtitle("Stroop Task")
当我尝试使用 zoo 库的rollmean
函数时出现问题。这是我试过的:
ggplot(cw_trials_f, aes(x=trial_number, y=rollmean(as.numeric(correct)-1, 50, na.pad=T, align="right"), col=difficulty)) +
facet_wrap(~session_id) +
geom_line() +
ggtitle("Stroop Task")
似乎这并不首先根据难度对数据进行分区然后应用rollmean函数,反之亦然。因此,仅显示一条线但是全部三种颜色。如何将rollmean分别应用于各类试验(简易,中等,硬)?
以下是一些示例数据:
session_id test_number trial_number trial_duration rule concordant switch correct reaction_time difficulty
1 11674020 1 1 1872 word concordant yes yes 1357 Easy
2 11674020 1 2 2839 word discordant no yes 2324 Medium
3 11674020 1 3 1525 color discordant yes no 1025 Hard
4 11674020 1 4 1544 color discordant no no 1044 Medium
5 11674020 1 5 1451 word concordant yes yes 952 Easy
6 11674020 1 6 1252 color concordant yes yes 746 Easy
答案 0 :(得分:1)
所以,我最后从上面的评论中关注@joran的建议(谢谢)并做了以下事情:
cw_trials_f <- ddply(cw_trials_f, .(session_id, difficulty), .fun = function(X) transform(X, movrt = rollmean(X$reaction_time, 50, na.pad=T, align="right"), movacc = rollmean(as.numeric(X$correct)-1, 50, na.pad=T, align="right")))
这会在data.frame中添加两个额外的列,其中包含精度和反应时间的移动平均值。
然后这可以很好地绘制它们:
ggplot(cw_trials_f, aes(x=trial_number, y=movacc, col=difficulty)) + geom_line() + facet_wrap(~session_id) + ggtitle("Stroop Task")
与我最初的想法相比,这有一个(次要的)缺点:它使移动平均功能尝试不同的长度变得有点乏味和缓慢。