使用 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
代表一個州的城市人口百分比。它與其他變種 Murder
,Assault
和 Rape
不同,後者是每 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