瞎忙了一阵子,惊觉许久未动笔撰写闲话家常了,虽然每天都会操作或阅读一些 R 相关文件,但总觉不能脱稿太久。回想起常在课堂上对学生或学员们说:「 R 海无涯,为勤是岸。」不但是鼓励学员,也算是一种自我惕励。但这样说来,好像学 R 是件令人可惧的事,其实读者们不用太担心!因为 R 玩家中有许多强大的巨人会引领我们向前航行。比如说今天的主角
plyr 套 件 ,就 是由多 产的 美国 Rice 大学统 计系助理 教授,纽西兰裔的 Hadley Wickham(http://had.co.nz/)所开发的,他是资料视觉化(data visualization)的专家,也是知名的资料整理(data manipulation)套件 reshape 与绘图套件 ggplot2 的主要开发者。

plyr 的读音同英文的老虎钳(pliers)去掉字尾 s,顾名思义它是运用分割-应用-组合(split-apply-combine)的策略于资料分析的工作上,也就是说将一大的问题,切割为可管控的子集,个别进行问题解决后,再重新组合起来。举例来说,先建一个包含三个数值变数与两个因子的72 笔资料,

> library(plyr)
> dd <- data.frame(matrix(round(rnorm(216), 2), 72, 3), c(rep("A", 24), rep("B", 24), rep("C",
+ 24)), c(rep("J", 36), rep("K", 36)))
> colnames(dd) <- c("v1", "v2", "v3", "dim1", "dim2")
> head(dd)

     v1     v2       v3    dim1 dim2
1 0.55  -0.37 -0.79     A       J
2 0.87  -1.37   0.03    A       J
3 -0.78 -0.11 -1.59    A       J
4 3.09  -0.63  -0.60   A       J
5 -0.02  2.16  -0.07   A       J
6 0.26  0.80   -2.31   A       J


plyr 套件中的 ddply 函数可以不用撰写回圈,迅速地计算出两因子 dim1 与 dim2 各种可能组合下,数值变数 v1 的平均数。

> ddply(dd, c("dim1", "dim2"), function(df) mean(df$v1))

  dim1 dim2    V1
1  A      J    0.38250
2  B      J   -0.42500
3  B      K   0.09833
4  C      K  -0.17250

其实它的功能如同 SQL 中的某些指令,或是可看成 EXCEL 的枢纽分析。这对弹性强大的 R来说不是一件新鲜事,R 玩家常挂在嘴边的一句话就是:「几乎没有 R 完成不了的资料分析工作!」上述计算的另一种 ddply 函数写法如下:

> ddply(dd, c("dim1", "dim2"), summarise, V1 = mean(v1))

   dim1 dim2    V1
1   A      J    0.38250
2   B      J   -0.42500
3   B      K   0.09833
4   C     K   -0.17250

ddply 的头两个英文字母分别代表函数的输入为资料框(data frame),输出结果亦为资料框。当然,plyr 套件还有其它的函数,ldply 表输入为串列(list),输出为资料框;alply 表输入为阵列(array),输出为串列;d_ply 则不传回任何物件,通常此函数输出到图形装置或档案,更多的资讯请参考 plyr 手册或下面的参考资料。

参考资料:Wickham, H. (2011), “The split-apply-combine strategy for data analysis”, Journal of Statistical Software, Vol. 40, Issue 1, pp. 1-29.

 

撰文者:
邹庆士 博士
现任:
北商资讯与决策科学所教授
中华 R 软体学会理事长
信箱:
[email protected]

相关文章