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