巨人的肩膀與 plyr R軟體套件

瞎忙了一陣子,驚覺許久未動筆撰寫閒話家常了,雖然每天都會操作或閱讀一些 R 相關文件,但總覺不能脫稿太久。回想起常在課堂上對學生或學員們說:「 R 海無涯,為勤是岸。」不但是鼓勵學員,也算是一種自我惕勵。但這樣說來,好像學 R 是件令人可懼的事,其實讀者們不用太擔心!因為 R 玩家中有許多強大的巨人會引領我們向前航行。比如說今天的主角<br />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.32    -0.55    2.52         A        J
2    -1.13     1.27   -0.19         A        J
3     0.40     1.51   -0.30         A        J
4     0.40     0.65    1.37         A        J
5    -0.93     0.67   -0.09         A       J
6    -0.05     0.17    0.71         A       J

plyr 套件中的 ddply 函數可以不用撰寫迴圈,迅速地計算出兩因子 dim1 與 dim2 各種可能組合下,數值變數 v1 的平均數。

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

    dim1   dim2                 V1
1        A        J    -0.05333333
2        B        J    -0.15416667
3        B        K     0.14666667
4        C        K     0.17041667

其實它的功能如同 SQL 中的某些指令,或是可看成 EXCEL 的樞紐分析。這對彈性強大的 R來說不是一件新鮮事,R 玩家常掛在嘴邊的一句話就是:「幾乎沒有 R 完成不了的資料分析工作!」上述計算的另一種 ddply 函數寫法如下:

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

    dim1   dim2                 V1
1        A        J    -0.05333333
2        B        J    -0.15416667
3        B        K     0.14666667
4        C        K     0.17041667

ddply 的頭兩個英文字母分別代表函數的輸入為資料框(data frame),輸出結果亦為資料框。當然,plyr 套件還有其它的函數,ldply 表輸入為串列(list),輸出為資料框;alply 表輸入為陣列(array),輸出為串列;d_ply 則不傳回任何物件,通常此函數輸出到圖形裝置或檔案,更多的資訊請參考 plyr 手冊或下面的參考資料。

 

參考資料:Wickham, H. (2011), &ldquo;The split-apply-combine strategy for data analysis&rdquo;, Journal of Statistical Software, Vol. 40, Issue 1, pp. 1-29.

  

撰文者:
鄒慶士 博士
現任:
北商資訊與決策科學所教授
中華 R 軟體學會理事長
信箱:
vince.tsou@gmail.com