瞎忙了一陣子,驚覺許久未動筆撰寫閒話家常了,雖然每天都會操作或閱讀一些 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.
撰文者: |