使用 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