使用 data.table 透視和解析表格資料 - I.

從寬格式轉換為長格式

datasets 載入 data USArrests

data("USArrests")
head(USArrests)

           Murder Assault UrbanPop Rape
Alabama      13.2     236       58 21.2
Alaska       10.0     263       48 44.5
Arizona       8.1     294       80 31.0
Arkansas      8.8     190       50 19.5
California    9.0     276       91 40.6
Colorado      7.9     204       78 38.7

使用 ?USArrests 瞭解更多資訊。首先,轉換為 data.table。狀態名稱是原始 data.frame 中的行名稱。

library(data.table)
DT <- as.data.table(USArrests, keep.rownames=TRUE)

這是廣泛形式的資料。它為每個變數都有一列。資料也可以以長形式儲存而不會丟失資訊。long 表單有一列儲存變數名稱。然後,它有另一列變數值。USArrests 的長形看起來像這樣。

            State    Crime  Rate
  1:       Alabama   Murder  13.2
  2:        Alaska   Murder  10.0
  3:       Arizona   Murder   8.1
  4:      Arkansas   Murder   8.8
  5:    California   Murder   9.0
 ---                             
196:      Virginia     Rape  20.7
197:    Washington     Rape  26.2
198: West Virginia     Rape   9.3
199:     Wisconsin     Rape  10.8
200:       Wyoming     Rape  15.6

我們使用 melt 函式從寬格式轉換為長格式。

DTm <- melt(DT)
names(DTm) <- c("State", "Crime", "Rate")

預設情況下,melt 將所有具有數值資料的列視為具有值的變數。在 USArrests 中,變數 UrbanPop 代表一個州的城市人口百分比。它與其他變種 MurderAssaultRape 不同,後者是每 10 萬人報告的暴力犯罪。假設我們想要保留 UrbanPop 列。我們通過如下設定 id.vars 來實現這一點。

DTmu <- melt(DT, id.vars=c("rn", "UrbanPop" ), 
             variable.name='Crime', value.name = "Rate")
names(DTmu)[1] <- "State"

請注意,我們已經使用 variable.name 指定了包含類別名稱(謀殺,攻擊等)的列的名稱,並且使用 value.name 指定了包含值的列。我們的資料看起來像這樣。

             State UrbanPop  Crime Rate
  1:       Alabama       58 Murder 13.2
  2:        Alaska       48 Murder 10.0
  3:       Arizona       80 Murder  8.1
  4:      Arkansas       50 Murder  8.8
  5:    California       91 Murder  9.0

使用 split-apply-combine 樣式方法生成摘要是輕而易舉的。例如,總結各州的暴力犯罪?

DTmu[, .(ViolentCrime = sum(Rate)), by=State]

這給出了:

        State ViolentCrime
1:    Alabama        270.4
2:     Alaska        317.5
3:    Arizona        333.1
4:   Arkansas        218.3
5: California        325.6
6:   Colorado        250.6