R绘制没有数据操作的简单数据帧的平均值和标准差

时间:2013-05-25 19:49:15

标签: r ggplot2

我有一个简单的数据框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):

enter image description here

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

感谢BeasterField,我正在按以下方式转换数据:

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? 该图是在没有连接线的情况下构建的:enter image description here

此外,我希望我的Y轴的最大值为20.

1 个答案:

答案 0 :(得分:3)

您可以使用data.frame

reshape2::melt从宽格式转换为长格式
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命令,你会看到你会得到 enter image description here