close

瞎忙了一陣子,驚覺許久未動筆撰寫閒話家常了,雖然每天都會操作或閱讀一些 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 軟體學會理事長
信箱:
vince.tsou@gmail.com

arrow
arrow

    CARS 發表在 痞客邦 留言(0) 人氣()