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