2014年6月19日 星期四

[R][翻譯]Reshape(transpose)! 資料的變形金剛

 

        今天的文章來自這裡
Reshape Package in R: Long Data format, to Wide, back to Long again 
        我們在做資料的時候,為了配合不同的演算法、公式、統計套件、或整理報表需求,我們常常需要將資料轉來轉去。最簡單的轉法就是行列交換(又稱轉置、transpose),但是實務上,這種轉置用途太小了,我們需要更複雜的變形。

 
        下圖是個常見到資料庫儲存方式:兩個不同的factor:iv1和iv2,dv是不同的factor組合的結果值,如果我們要將這種data(本文稱之為long format),轉換成另外一種形式(本文稱之為wide format)要怎麼做呢?

     
上圖轉換成下圖?
        這時候如果是SAS就有功能很強大的transpose、SPSS無解、EXCEL好像有解但是很複雜,那如果是R呢?那就是要使用"Reshape"這個套件。

Get in Shape! The Reshape Package

以下面的例子來看:資料集有四個變項,分別是rank、class、spec、和dps
1
2
full_list_cutdown = data.frame("rank"=full_list_dps$X., "class"=full_list_dps$class,
"spec"=full_list_dps$spec, "dps"=full_list_dps$DPS)
The data look like this:

Rows truncated to prevent from filling entire page

接下來我們要用cast這個函數來將DATA變形:
1
cast(dataset, factor1 ~ factor2 ~ etc., value=value column, fun=aggregation method)

dataset:代表著目標的dataset

factor1~factor2~etc:表示等下要以什麼變項為主軸來轉置。(譯按:在轉置時的想像類似小時候拿圓規畫圓,針腳插著的變項是軸心,其他變項以主軸為圓心來轉置)

value:表示等下需要做其他計算的變項

fun=:有點類似sql語法中的參數,可以計算轉置後變項的平均值之類的,也支援自訂function

下列是將上面data轉置的語法:
1
wide_frame = data.frame(cast(full_list_cutdown, rank~class, value=c('dps'), fun=mean))

        轉置後的data如下圖,除了轉置之外,也另外計算的dps這個變項的平均值



There and Back Again: Getting from Wide to Long Format


        要轉回去就要用melt的指令
1
melt(wide_frame, id=c("rank"))

(譯按:這個指令的命名真的很有趣,下令要DATA變形--cast(施展之意),要讓變形後的data恢復原狀--就用melt(消解,消解原本施下的咒語?))