使用 data.table 進行透視和非透視表格資料 - II
從長格式轉換為寬格式
要恢復上一個示例中的資料,請像這樣使用 dcast
。
DTc <- dcast(DTmu, State + UrbanPop ~ Crime)
這樣可以提供原始寬泛的資料。
State UrbanPop Murder Assault Rape
1: Alabama 58 13.2 236 21.2
2: Alaska 48 10.0 263 44.5
3: Arizona 80 8.1 294 31.0
4: Arkansas 50 8.8 190 19.5
5: California 91 9.0 276 40.6
此處,公式表示法用於指定形成唯一記錄識別符號(LHS)的列和包含新列名稱(RHS)的類別標籤的列。哪個列用於數值?預設情況下,dcast
使用第一列,其中包含從公式規範中剩餘的數值。要明確,請將引數 value.var
與列名一起使用。
當操作在每個單元格中生成值列表時,dcast
提供了一種 fun.aggregate
方法來處理這種情況。假設我在調查犯罪率時對有類似城市人口的州感興趣。我新增了一個帶有計算資訊的列 Decile
。
DTmu[, Decile := cut(UrbanPop, quantile(UrbanPop, probs = seq(0, 1, by=0.1)))]
levels(DTmu$Decile) <- paste0(1:10, "D")
現在,施放 Decile ~ Crime
會為每個單元格生成多個值。我可以使用 fun.aggregate
來確定如何處理這些。文字和數值都可以這樣處理。
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
這給出了:
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=mean)
這給出了:
State UrbanPop Crime Rate Decile
1: Alabama 58 Murder 13.2 4D
2: Alaska 48 Murder 10.0 2D
3: Arizona 80 Murder 8.1 8D
4: Arkansas 50 Murder 8.8 2D
5: California 91 Murder 9.0 10D
城市人口的每個十分位數有多個州。使用 fun.aggregate
指定應如何處理這些。
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
這總結了類似狀態的資料,給出以下內容。
Decile Murder Assault Rape
1: 1D 39.4 808 62.6
2: 2D 35.3 815 94.3
3: 3D 22.6 451 67.7
4: 4D 54.9 898 106.0
5: 5D 42.4 758 107.6