【问题标题】:R plotting mean and standard deviation of simple dataframe without data manipulationR绘制没有数据处理的简单数据框的平均值和标准差
【发布时间】:2013-05-25 19:49:14
【问题描述】:

我有一个简单的数据框data

  V1 V2 V3 V4 V5
1  3  3  3  5  6
2  3  4  6 10 12
3  5  6  8 10 11
4  4  5  7  9 11
5  2  3  5  8  9

此数据代表每轮比赛期间的表现。例如在游戏 4 中,一个人在第三次迭代中得分 7。

我正在尝试创建这样的情节(情节取自here):

x 轴上将四舍五入,y 轴上以标准差为条形的平均性能。第一轮的平均表现将在列 V1 (3.4) 中平均,第二轮为 4.2。标准差也是根据V列计算的。

感谢 BasterField,我正在通过以下方式转换我的数据:

df$n <- rownames(df)
df <- melt(df, id.vars="n", value.name="perf", variable.name="iter" )
dfc <- ddply(df, .(iter), summarise, se = sd( perf )/sqrt(length(perf)), perf = mean(perf))

这给了我以下结果:

  iter        se perf
1   V1 0.5099020  3.4
2   V2 0.5830952  4.2
3   V3 0.8602325  5.8
4   V4 0.9273618  8.4
5   V5 1.0677078  9.8

但后来,当我尝试使用 ggplot 时

ggplot(dfc, aes(x=iter, y=perf))+geom_errorbar(aes(ymin=perf-se, ymax=perf+se), width=.1)+geom_line()+geom_point()

我收到:geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic? 该情节是在没有连接线的情况下构建的:

我还希望 Y 轴的最大值为 20。

【问题讨论】:

  • 为什么不能先操作数据框? ggplot2 是围绕着你首先重塑数据然后绘制它的想法构建的。
  • 你所说的“没有操纵”是什么意思,这个想法背后的动机是什么?
  • 你的情节的问题是,iter 是一个分类变量。如果您想向其中添加geom_line,您需要一个(伪)组。您可以通过将group =1 添加到aes() 来轻松解决此问题。但这是一个与您原来的问题完全不同的问题,应该单独讨论。

标签: r ggplot2


【解决方案1】:

您可以使用reshape2::meltdata.frame 从宽格式转换为长格式:

library( reshape2 )
mdf$n <- rownames(mdf)
mdf <- melt( mdf, id.vars="n", value.name="perf", variable.name="iter" )
mdf

   n iter perf
1  1   R1    4
2  2   R1    2
3  3   R1    1
4  1   R2    5
5  2   R2    3
6  3   R2    1
...

关于您的实际问题

我试图实现的是没有对数据框进行操作,但没有任何运气。

您应该知道,ggplot 旨在处理长格式的 data.frames。因此,首先融化然后绘制的过程是绝对常见的。有时两者之间还有一个拆分-应用-组合-步骤,正如您在summarySE 中指出的那样。在不知道这个函数的情况下,我猜它会做类似的事情

library( plyr)
mdf <- ddply( mdf, .(n), summarise, se = sd( perf )/sqrt(length(perf)), perf = mean(perf)) 
mdf
  n        se perf
1 1 1.0198039  6.8
2 2 0.2000000  2.8
3 3 0.7483315  2.4

使用你展示的 plot 命令你会得到

【讨论】:

  • 嗯,summarySE 究竟做了什么,或者它的结果如何?我问是因为如果你基于iter 分组,n 的聚合函数是什么?正如我所写,对于绘图,我重用了您在原始帖子中显示的绘图命令。
  • SummarySE 取自cookbook-r.com/Manipulating_data/Summarizing_data,并有一个示例及其结果。
  • 好的。从链接代码中可以看出,summarySE 几乎与我展示的一样。当您指定groupvars = "n" 时,这与我在ddply 命令.(n) 中指定的位置完全相同。也许您应该重新表述您的问题并更好地解释您想要绘制的内容:x 轴、y 轴、组?
猜你喜欢
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 2021-04-25
  • 1970-01-01
  • 2011-08-09
  • 2020-11-21
  • 1970-01-01
相关资源
最近更新 更多