R語言reshape2套件

說到用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() 就能輕鬆地將資料做變形。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s