說到用R整理資料一定會想到強大的 dplyr 套件,除了必備的 dplyr 套件外,小編也發現一個挺有趣的 reshape2 套件可以做資料的變形,所以想來分享一下。 reshape2 與 dplyr 均是由 R 界大神 Hadley Wickham 所寫,reshape2 套件裡最重要的兩個函數便是 melt() 與 dcast(),如同字面上的意思,melt 是熔化的意思,也就是將資料由多變數熔成較少變數且較長的資料;cast 是鑄造的意思,也就是將資料由較少變數鑄造成較多變數且較寬的資料,cast 有分 dcast 與 acast,只差在要輸出的形式是 data.frame 或是 array。
假設有一多商品價量資料data如下:
> data <- data.frame(time = as.POSIXct(rep(10^4+1:3, each=4), origin="2016-08-04"), + ID=rep(c("TXF","MXF","EXF","FXF"), 3), + price = rep(c(8000,8000,300,1000),3)+rbinom(12,50,0.5), + volume = 1+rbinom(12,5,0.5)) > data time ID price volume 1 2016-08-04 10:46:41 TXF 8022 4 2 2016-08-04 10:46:41 MXF 8017 4 3 2016-08-04 10:46:41 EXF 328 3 4 2016-08-04 10:46:41 FXF 1028 4 5 2016-08-04 10:46:42 TXF 8033 4 6 2016-08-04 10:46:42 MXF 8027 3 7 2016-08-04 10:46:42 EXF 326 5 8 2016-08-04 10:46:42 FXF 1025 1 9 2016-08-04 10:46:43 TXF 8028 3 10 2016-08-04 10:46:43 MXF 8023 3 11 2016-08-04 10:46:43 EXF 325 4 12 2016-08-04 10:46:43 FXF 1021 5
其中的ID變數紀錄了每一種商品的代號,可利用 dcast() 將此資料轉成寬資料。 在dcast() 的參數中,formula 的 “~" 符號是一種 R 常用的 formula 符號,在 “~" 的左邊放 time,右邊放 ID,並且在 value.var 中放感興趣的值,在這裡可以是 volume 或是 price。經過 dcast() 函數後,各種商品均變成個別的變數了。
library(reshape2) > dcast(data, formula = time ~ ID, value.var = c("volume")) time EXF FXF MXF TXF 1 2016-08-04 10:46:41 3 4 4 4 2 2016-08-04 10:46:42 5 1 3 4 3 2016-08-04 10:46:43 4 5 3 3 > (cast.data <- dcast(data, formula = time ~ ID, value.var = c("price"))) time EXF FXF MXF TXF 1 2016-08-04 10:46:41 328 1028 8017 8022 2 2016-08-04 10:46:42 326 1025 8027 8033 3 2016-08-04 10:46:43 325 1021 8023 8028
也可以利用 melt() 將寬資料 cast.data 轉成長資料:
> melt(cast.data, id.vars =c("time"), variable.name = "ID", value.name = "price") time ID price 1 2016-08-04 10:46:41 EXF 328 2 2016-08-04 10:46:42 EXF 326 3 2016-08-04 10:46:43 EXF 325 4 2016-08-04 10:46:41 FXF 1028 5 2016-08-04 10:46:42 FXF 1025 6 2016-08-04 10:46:43 FXF 1021 7 2016-08-04 10:46:41 MXF 8017 8 2016-08-04 10:46:42 MXF 8027 9 2016-08-04 10:46:43 MXF 8023 10 2016-08-04 10:46:41 TXF 8022 11 2016-08-04 10:46:42 TXF 8033 12 2016-08-04 10:46:43 TXF 8028
以上如果要用 dplyr 套件來做同樣的事,需要將各商品名稱分別取出來,做適當的命名後再合併,相較於 reshape2 套件就顯得太冗長了。只要適當的搭配 melt() 與 dcast() 就能輕鬆地將資料做變形。