接上一篇筆記【r<-分析】分析之前,準備數據
很多R用戶都搞不太清楚用于修整數據的內置函數(比如stack、unstack與reshape),慶幸的是我們還有其他選擇,Hadley Wickham(ggplot2的作者)開發(fā)了一個reshape2庫,用更直觀的方式將數據修整為所需要的形式。
熔解與鑄造
reshape庫用一個直觀的模型來描述如何操作數據表。Hadley發(fā)現,如果有詳細的事項數據,就可以很方便地將這些數據轉換成各種形式。通常,我們會拿到一個數據表,將其轉換為一系列事項,然后將其修整為所需的格式。他將數據表轉換成事項列表的過程稱為熔解(melt),將事項列表轉換成數據表的過程稱為鑄造(cast)。
使用例子
我們用一個例子來看一下熔解與鑄造究竟是怎么回事,以體會reshape2包的有用之處。
# 使用數據展示
head(airquality)
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
## 6 28 NA 14.9 66 5 6
熔解
數據集的熔解是將它重構為這樣一種格式:每個觀測變量獨占一行,行中要帶有唯一確定這個測量所需的標識變量。
比如我們可以通過Month與Day兩個變量唯一確定數據的一行。
# 導入包
library(reshape2)
md <- melt(airquality, id=c("Month", "Day"))
head(md, 20)
## Month Day variable value
## 1 5 1 Ozone 41
## 2 5 2 Ozone 36
## 3 5 3 Ozone 12
## 4 5 4 Ozone 18
## 5 5 5 Ozone NA
## 6 5 6 Ozone 28
## 7 5 7 Ozone 23
## 8 5 8 Ozone 19
## 9 5 9 Ozone 8
## 10 5 10 Ozone NA
## 11 5 11 Ozone 7
## 12 5 12 Ozone 16
## 13 5 13 Ozone 11
## 14 5 14 Ozone 14
## 15 5 15 Ozone 18
## 16 5 16 Ozone 14
## 17 5 17 Ozone 34
## 18 5 18 Ozone 6
## 19 5 19 Ozone 30
## 20 5 20 Ozone 11
可以發(fā)現,標為id的變量都沒有改變,而其他變量都變成一個新生變量的值,另外一列變量記錄對應的數值結果。
我們可以修改參數來更靈活地進行處理:
melt(data, id.vars, measure.vars,
variable.name = "variable", ..., na.rm = FALSE, value.name = "value",
factorsAsStrings = TRUE)
md <- melt(airquality, id.vars = c("Month", "Day"), value.name = "New_Value", variable.name = "Class")
head(md, 20)
## Month Day Class New_Value
## 1 5 1 Ozone 41
## 2 5 2 Ozone 36
## 3 5 3 Ozone 12
## 4 5 4 Ozone 18
## 5 5 5 Ozone NA
## 6 5 6 Ozone 28
## 7 5 7 Ozone 23
## 8 5 8 Ozone 19
## 9 5 9 Ozone 8
## 10 5 10 Ozone NA
## 11 5 11 Ozone 7
## 12 5 12 Ozone 16
## 13 5 13 Ozone 11
## 14 5 14 Ozone 14
## 15 5 15 Ozone 18
## 16 5 16 Ozone 14
## 17 5 17 Ozone 34
## 18 5 18 Ozone 6
## 19 5 19 Ozone 30
## 20 5 20 Ozone 11
一旦我們擁有融合后的數據,就可以使用dcast()將它鑄造為任意形狀。
鑄造
dcast()讀取已熔解的數據,并使用你提供的一個公式和一個可選的整合數據的函數將其重鑄。
公式形式如下:
rowvar1 + rowvar2 + ... ~ colvar1 + colvar2 + ...
在這個公式中,~左邊定義了要劃掉的變量集合,以確定各行的內容,而右邊定義要劃掉、確定各列內容的變量集合。
# 對每月結果求平均
dcast(md, Month ~ Class, mean)
## Using New_Value as value column: use value.var to override.
## Month Ozone Solar.R Wind Temp
## 1 5 NA NA 11.62 65.5
## 2 6 NA 190 10.27 79.1
## 3 7 NA 216 8.94 83.9
## 4 8 NA NA 8.79 84.0
## 5 9 NA 167 10.18 76.9
# 對每天的所有變量結果求平均
dcast(md, Month ~ Day, mean)
## Using New_Value as value column: use value.var to override.
## Month 1 2 3 4 5 6 7 8 9 10 11 12
## 1 5 76.3 58.5 61.9 101.1 NA NA 98.9 47.7 27.0 NA NA 87.7
## 2 6 NA NA NA NA NA NA 61.9 NA 116.5 115.1 NA NA
## 3 7 123.0 97.8 89.5 NA 81.7 112.0 111.5 115.6 116.7 89.1 NA 90.3
## 4 8 52.5 31.9 45.6 NA NA NA 117.5 104.6 103.8 NA NA 83.4
## 5 9 90.2 93.0 88.0 94.4 59.1 55.9 90.7 82.8 84.2 91.4 94 92.9
## 13 14 15 16 17 18 19 20 21 22 23 24 25
## 1 94.0 91.7 38.5 105.9 104.8 39.9 107.9 31.7 19.4 105.2 24.9 49.2 NA
## 2 65.2 NA NA 76.0 103.4 32.8 54.1 59.1 NA NA NA NA NA
## 3 74.5 NA 37.3 99.0 100.3 109.1 89.5 94.9 26.0 NA NA 117.2 106.0
## 4 98.6 77.9 NA 45.1 48.8 55.4 91.0 80.6 93.1 32.8 NA 86.4 122.6
## 5 87.3 28.7 51.9 92.0 80.7 31.6 85.1 76.8 81.9 29.3 66.6 33.8 28.4
## 26 27 28 29 30 31
## 1 NA NA 28.8 98.2 105.7 99.8
## 2 NA NA NA NA NA NaN
## 3 47.9 58 97.6 104.6 101.8 100.8
## 4 95.5 NA 96.4 109.8 105.8 93.3
## 5 75.0 NA 73.6 58.2 80.6 NaN
# 變回原來的
dcast(md, Month + Day ~ Class)
## Using New_Value as value column: use value.var to override.
## Month Day Ozone Solar.R Wind Temp
## 1 5 1 41 190 7.4 67
## 2 5 2 36 118 8.0 72
## 3 5 3 12 149 12.6 74
## 4 5 4 18 313 11.5 62
## 5 5 5 NA NA 14.3 56
## 6 5 6 28 NA 14.9 66
## 7 5 7 23 299 8.6 65
## 8 5 8 19 99 13.8 59
## 9 5 9 8 19 20.1 61
## 10 5 10 NA 194 8.6 69
## 11 5 11 7 NA 6.9 74
## 12 5 12 16 256 9.7 69
## 13 5 13 11 290 9.2 66
## 14 5 14 14 274 10.9 68
## 15 5 15 18 65 13.2 58
## 16 5 16 14 334 11.5 64
## 17 5 17 34 307 12.0 66
## 18 5 18 6 78 18.4 57
## 19 5 19 30 322 11.5 68
## 20 5 20 11 44 9.7 62
## 21 5 21 1 8 9.7 59
## 22 5 22 11 320 16.6 73
## 23 5 23 4 25 9.7 61
## 24 5 24 32 92 12.0 61
## 25 5 25 NA 66 16.6 57
## 26 5 26 NA 266 14.9 58
## 27 5 27 NA NA 8.0 57
## 28 5 28 23 13 12.0 67
## 29 5 29 45 252 14.9 81
## 30 5 30 115 223 5.7 79
## 31 5 31 37 279 7.4 76
## 32 6 1 NA 286 8.6 78
## 33 6 2 NA 287 9.7 74
## [到達getOption("max.print") -- 略過120行]]
#
dcast(md, Month+Class ~ Day)
## Using New_Value as value column: use value.var to override.
## Month Class 1 2 3 4 5 6 7 8 9
## 1 5 Ozone 41.0 36.0 12.0 18.0 NA 28.0 23.0 19.0 8.0
## 2 5 Solar.R 190.0 118.0 149.0 313.0 NA NA 299.0 99.0 19.0
## 3 5 Wind 7.4 8.0 12.6 11.5 14.3 14.9 8.6 13.8 20.1
## 4 5 Temp 67.0 72.0 74.0 62.0 56.0 66.0 65.0 59.0 61.0
## 5 6 Ozone NA NA NA NA NA NA 29.0 NA 71.0
## 6 6 Solar.R 286.0 287.0 242.0 186.0 220.0 264.0 127.0 273.0 291.0
## 10 11 12 13 14 15 16 17 18 19 20 21
## 1 NA 7.0 16.0 11.0 14.0 18.0 14.0 34.0 6.0 30.0 11.0 1.0
## 2 194.0 NA 256.0 290.0 274.0 65.0 334.0 307.0 78.0 322.0 44.0 8.0
## 3 8.6 6.9 9.7 9.2 10.9 13.2 11.5 12.0 18.4 11.5 9.7 9.7
## 4 69.0 74.0 69.0 66.0 68.0 58.0 64.0 66.0 57.0 68.0 62.0 59.0
## 5 39.0 NA NA 23.0 NA NA 21.0 37.0 20.0 12.0 13.0 NA
## 6 323.0 259.0 250.0 148.0 332.0 322.0 191.0 284.0 37.0 120.0 137.0 150.0
## 22 23 24 25 26 27 28 29 30 31
## 1 11.0 4.0 32.0 NA NA NA 23.0 45.0 115.0 37.0
## 2 320.0 25.0 92.0 66.0 266.0 NA 13.0 252.0 223.0 279.0
## 3 16.6 9.7 12.0 16.6 14.9 8.0 12.0 14.9 5.7 7.4
## 4 73.0 61.0 61.0 57.0 58.0 57.0 67.0 81.0 79.0 76.0
## 5 NA NA NA NA NA NA NA NA NA NA
## 6 59.0 91.0 250.0 135.0 127.0 47.0 98.0 31.0 138.0 NA
## [到達getOption("max.print") -- 略過14行]]
#
dcast(md, Month ~ Class + Day)
## Using New_Value as value column: use value.var to override.
## Month Ozone_1 Ozone_2 Ozone_3 Ozone_4 Ozone_5 Ozone_6 Ozone_7 Ozone_8
## 1 5 41 36 12 18 NA 28 23 19
## Ozone_9 Ozone_10 Ozone_11 Ozone_12 Ozone_13 Ozone_14 Ozone_15 Ozone_16
## 1 8 NA 7 16 11 14 18 14
## Ozone_17 Ozone_18 Ozone_19 Ozone_20 Ozone_21 Ozone_22 Ozone_23 Ozone_24
## 1 34 6 30 11 1 11 4 32
## Ozone_25 Ozone_26 Ozone_27 Ozone_28 Ozone_29 Ozone_30 Ozone_31 Solar.R_1
## 1 NA NA NA 23 45 115 37 190
## Solar.R_2 Solar.R_3 Solar.R_4 Solar.R_5 Solar.R_6 Solar.R_7 Solar.R_8
## 1 118 149 313 NA NA 299 99
## Solar.R_9 Solar.R_10 Solar.R_11 Solar.R_12 Solar.R_13 Solar.R_14
## 1 19 194 NA 256 290 274
## Solar.R_15 Solar.R_16 Solar.R_17 Solar.R_18 Solar.R_19 Solar.R_20
## 1 65 334 307 78 322 44
## Solar.R_21 Solar.R_22 Solar.R_23 Solar.R_24 Solar.R_25 Solar.R_26
## 1 8 320 25 92 66 266
## Solar.R_27 Solar.R_28 Solar.R_29 Solar.R_30 Solar.R_31 Wind_1 Wind_2
## 1 NA 13 252 223 279 7.4 8.0
## Wind_3 Wind_4 Wind_5 Wind_6 Wind_7 Wind_8 Wind_9 Wind_10 Wind_11 Wind_12
## 1 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 6.9 9.7
## Wind_13 Wind_14 Wind_15 Wind_16 Wind_17 Wind_18 Wind_19 Wind_20 Wind_21
## 1 9.2 10.9 13.2 11.5 12.0 18.4 11.5 9.7 9.7
## Wind_22 Wind_23 Wind_24 Wind_25 Wind_26 Wind_27 Wind_28 Wind_29 Wind_30
## 1 16.6 9.7 12.0 16.6 14.9 8.0 12.0 14.9 5.7
## Wind_31 Temp_1 Temp_2 Temp_3 Temp_4 Temp_5 Temp_6 Temp_7 Temp_8 Temp_9
## 1 7.4 67 72 74 62 56 66 65 59 61
## Temp_10 Temp_11 Temp_12 Temp_13 Temp_14 Temp_15 Temp_16 Temp_17 Temp_18
## 1 69 74 69 66 68 58 64 66 57
## Temp_19 Temp_20 Temp_21 Temp_22 Temp_23 Temp_24 Temp_25 Temp_26 Temp_27
## 1 68 62 59 73 61 61 57 58 57
## Temp_28 Temp_29 Temp_30 Temp_31
## 1 67 81 79 76
## [到達getOption("max.print") -- 略過4行]]
參考:
R核心技術手冊以及R實戰(zhàn)
