2

我确信这个问题之前已经回答过了,但是我想通过同时处理多个变量(100s)来计算均值和标准差,并且除了使用冗长的 ddply 代码之外无法弄清楚如何做到这一点。

这是我的数据框(g)的一部分:

   trt blk til res sand silt clay ibd1_6 ibd9_14 ibd_ave
1  CTK   1  CT   K   74   15   11  1.323   1.593   1.458
2  CTK   2  CT   K   71   15   14  1.575   1.601   1.588
3  CTK   3  CT   K   72   14   14  1.551   1.594   1.573
4  CTR   1  CT   R   72   15   13  1.560   1.647   1.604
5  CTR   2  CT   R   73   14   13  1.612   1.580   1.596
6  CTR   3  CT   R   73   13   14  1.709   1.577   1.643
7  ZTK   1  ZT   K   72   16   12  1.526   1.546   1.536
8  ZTK   2  ZT   K   71   16   13  1.292   1.626   1.459
9  ZTK   3  ZT   K   71   17   12  1.623   1.607   1.615
10 ZTR   1  ZT   R   66   16   18  1.719   1.709   1.714
11 ZTR   2  ZT   R   67   17   16  1.529   1.708   1.618
12 ZTR   3  ZT   R   66   17   17  1.663   1.655   1.659 

我想要一个函数来做 ddply 所做的事情,即 ddply(g, trt, meanSand=mean(sand), sdSand=sd(sand), meanSilt=mean(silt)...) 而无需编写它全力以赴。有任何想法吗?感谢您的耐心等待!

4

3 回答 3

3

您可能希望应用于数据框的函数是aggregate()使用meansd作为函数参数。

于 2013-04-18T20:34:40.090 回答
2

假设myDF是您的原始数据集:

library(data.table)
myDT <- data.table(myDF)

# Which variables to calculate  All columns but the first five? : 
variables <- tail( names(myDT), -5)

myDT[, lapply(.SD, function(x) list(mean(x), sd(x))), .SDcols=variables, by=list(trt, til)]


## OR Separately, if you prefer shorter `lapply` statements
myDT[, lapply(.SD, mean), .SDcols=variables, by=list(trt, til)]
myDT[, lapply(.SD, sd),   .SDcols=variables, by=list(trt, til)]

--

> myDT[, lapply(.SD, mean), .SDcols=variables, by=list(trt, til)]
#    trt til     silt     clay   ibd1_6  ibd9_14  ibd_ave
# 1: CTK  CT 14.66667 13.00000 1.483000 1.596000 1.539667
# 2: CTR  CT 14.00000 13.33333 1.627000 1.601333 1.614333
# 3: ZTK  ZT 16.33333 12.33333 1.480333 1.593000 1.536667
# 4: ZTR  ZT 16.66667 17.00000 1.637000 1.690667 1.663667

> myDT[, lapply(.SD, sd), .SDcols=variables, by=list(trt, til)]
#    trt til      silt      clay     ibd1_6     ibd9_14    ibd_ave
# 1: CTK  CT 0.5773503 1.7320508 0.13908271 0.004358899 0.07112196
# 2: CTR  CT 1.0000000 0.5773503 0.07562407 0.039576929 0.02514624
# 3: ZTK  ZT 0.5773503 0.5773503 0.17015973 0.041797129 0.07800214
# 4: ZTR  ZT 0.5773503 1.0000000 0.09763196 0.030892286 0.04816984
于 2013-04-18T21:02:52.713 回答
1
aggregate(g[, c("sand", "silt", "clay")],  g$trt, function(x) c(mean=mean(x), sd=sd(x) ) )

使用匿名函数aggregate.data.frame允许一个人通过一次调用获得两个值。您只想传入要聚合的列。如果您有很长的列列表并且只想从计算中排除前 4 个列,则可以写为:

aggregate(g[, names(g)[-(1:4)],  g$trt, function(x) c(mean=mean(x), sd=sd(x) ) )
于 2013-04-18T20:49:11.270 回答