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