按列中的ID和日计算平均值和sd

时间:2013-04-10 13:26:30

标签: r identity-column

我是R的新手,需要在新表中汇总我的数据的均值和sd:

原始数据看起来像这样:

ID    Day    pH
1      1      7
1      1      7.2
1      1      7.1
2      1      7.3
2      1      7.4
2      1      7.2
3      1      7
3      1      7.1
3      1      7.5
4      1      7.3
4      1      7.2
4      1      7.6
1      2      7
1      2      7.2
1      2      7.1
2      2      7.1
2      2      7.4
2      2      7.2
3      2      7.5
3      2      7.1
3      2      7.5
4      2      7.2
4      2      7.2
4      2      7.3
1      3      7.4
1      3      7.2
1      3      7.1
2      3      7.2
2      3      7.4
2      3      7.2
3      3      7.4
3      3      7.2
3      3      7.5
4      3      7.4
4      3      7.2
4      3      7.7

我想要的表应该是这样的:

ID    Day    pHmean   pHsd
1      1      7.1      0.10
2      1      7.3      0.10
3      1      7.2      0.26
4      1      7.4      0.21
1      2      7.1      0.10
2      2      7.2      0.15
3      2      7.4      0.23
4      2      7.2      0.06
1      3      7.2      0.15
2      3      7.3      0.12
3      3      7.4      0.15
4      3      7.4      0.25

然后我想创建一个条形图,其中的误差条显示y-achsis上的pH值和x-achsis上的ID以及不同颜色条中的天数。

希望有人可以帮助我!

4 个答案:

答案 0 :(得分:2)

作为解决方案发布,因为有一些讨论是否有效(可能是R版本或其他):

aggregate(pH~ID+Day, dat, function(x) round(c(mean=mean(x), sd=sd(x)), 2))

## > aggregate(pH~ID+Day, dat, function(x) round(c(mean=mean(x), sd=sd(x)), 2))
##    ID Day pH.mean pH.sd
## 1   1   1    7.10  0.10
## 2   2   1    7.30  0.10
## 3   3   1    7.20  0.26
## 4   4   1    7.37  0.21
## 5   1   2    7.10  0.10
## 6   2   2    7.23  0.15
## 7   3   2    7.37  0.23
## 8   4   2    7.23  0.06
## 9   1   3    7.23  0.15
## 10  2   3    7.27  0.12
## 11  3   3    7.37  0.15
## 12  4   3    7.43  0.25

答案 1 :(得分:1)

我建议使用aggregate函数,如此...

pHmean <- aggregate( pH ~ Day + ID , data = dat , FUN = mean )[,3]

dat <- cbind( aggregate( pH ~ Day + ID , data = dat , FUN = sd ) , pHmean )
dat
   Day ID         pH   pHmean
1    1  1 0.10000000 7.100000
2    2  1 0.10000000 7.100000
3    3  1 0.15275252 7.233333
4    1  2 0.10000000 7.300000
5    2  2 0.15275252 7.233333
6    3  2 0.11547005 7.266667
7    1  3 0.26457513 7.200000
8    2  3 0.23094011 7.366667
9    3  3 0.15275252 7.366667
10   1  4 0.20816660 7.366667
11   2  4 0.05773503 7.233333
12   3  4         NA 7.400000

答案 2 :(得分:0)

对于值,您可以使用包plyr:

x
ID    Day    pH
1      1      7
1      1      7.2
1      1      7.1
2      1      7.3
2      1      7.4
2      1      7.2
3      1      7
3      1      7.1
3      1      7.5
4      1      7.3
4      1      7.2
4      1      7.6
1      2      7
1      2      7.2
1      2      7.1
2      2      7.1
2      2      7.4
2      2      7.2
3      2      7.5
3      2      7.1
3      2      7.5
4      2      7.2
4      2      7.2
4      2      7.3
1      3      7.4
1      3      7.2
1      3      7.1
2      3      7.2
2      3      7.4
2      3      7.2
3      3      7.4
3      3      7.2
3      3      7.5
4      3      7.4
4      3      7.2
4      3      7.7
require(plyr)
d1 <- ddply(x, .(ID, Day), summarize, phMean=mean(pH), pHsd=sd(pH))
d2 <- reshape(d1, v.names=c("phMean", "pHsd"), idvar="ID",     timevar="Day",direction="wide")
rownames(d2) <- d2[,1]
d2 <- t(d2[,-1])

require(gplots)
barplot2(d2[(1:nrow(d2))%%2>0.5,], beside=T, plot.ci=T, 
ci.l=d2[(1:nrow(d2))%%2>0.5,]-d2[(1:nrow(d2))%%2<0.5,],
ci.u=d2[(1:nrow(d2))%%2>0.5,]+d2[(1:nrow(d2))%%2<0.5])

答案 3 :(得分:0)

感谢您的所有评论和答案,这非常有用!!

我已经设法使用以下方式制作图表:

barplot(矩阵(c(Rtest.dat $ pH.mean),nr = 3),旁边= T,col = c(“黑色”,“灰色”,“白色”),主要=“pH”, names.arg = c(“绿色”,“黄色”,“蓝色”,“红色”),ylab =“pH”)图例(“topright”,c(“第1天”,“第2天”,“第3天) “),cex = 0.6,bty =”n“,fill = c(”黑色“,”灰色“,”白色“))

但我卡住了,不知道如何添加错误栏?!?我在网上看,但无法弄清楚。希望你能帮助我!!