重塑 data.table

在前面的章节中,我们已经学习了如何使用 reshape2 扩展包对 data.frame 进行
塑形。其实,data.table 扩展包为 data.table 对象提供了更快更强的 dcast( ) 函
数和 melt( ) 函数。
例如,将 toy_tests 的每个产品的质量得分按照年和月进行对齐:
toy_tests[, ym := substr(date, 1, 6)]
toy_quality <- dcast(toy_tests, ym ~ id, value.var = "quality")
toy_quality
## ym T01 T02
## 1: 201602 9 7
## 2: 201603 10 8
## 3: 201604 9 9
## 4: 201605 9 10
首先,我们使用 := 在 toy_tests 中直接创建了一个新列 ym,然后,使用 dcast( )
对 toy_tests 进行转换,这一步和前面 reshape2 的例子是一样的。结果看起来和在数
据框上使用 reshape2::dcast( ) 一样。
但是,reshape2::dcast( ) 不支持多个变量,而 data.table::dcast( ) 可以:
toy_tests2 <- dcast(toy_tests, ym ~ id, value.var = c("quality",
"durability"))
toy_tests2
## ym quality_T01 quality_T02 durability_T01 durability_T02
## 1: 201602 9 7 9 9
## 2: 201603 10 8 9 8
## 3: 201604 9 9 10 8
## 4: 201605 9 10 9 9
除了第 1 列以外,其他的列名都不再是 id 值,而是用下划线将变量名和 id 值连接起
来。此外,塑形公式 ym~id 左边的变量将被自动设置为结果 data.table 的键:
key(toy_tests2)
## [1] "ym"
这个键意味着我们可以通过提供一个 ym 的值,直接获得对应的记录。然而,下面的
代码会报错:
toy_tests2[.(201602)]
## Error in bmerge(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, :
x.'ym' is a character column being joined to i.'V1' which is type 'double'.
Character columns must join to factor or character columns.
从错误信息来看,是因为数据的类型存在一些问题。因此,我们通过以下代码来查看
每一列的类:
sapply(toy_tests2, class)
## ym quality_T01 quality_T02 durability_T01
## "character" "integer" "integer" "integer"
## durability_T02
## "integer"
问题出在 ym 的类上。它是一个字符向量,但是我们提供了数值型的键。因为无法匹
配数据类型,所以搜索失败。如果我们提供一个字符串,便可得到对应的记录:
toy_tests2["201602"]
## ym quality_T01 quality_T02 durability_T01 durability_T02
## 1: 201602 9 7 9 9
但是,ym 是如何变成字符的呢?回顾一下,在 ym := substr(date, 1, 6)
中, date 是一个整数向量,但是,调用 substr( )函数时,先将 date 强制转换成字
符向量,再提取前 6 个字符。因此,结果是一个字符向量,至此,我们就很不会觉得那
么奇怪了。以下是简单的演示:
class(20160101)
## [1] "numeric"
class(substr(20160101, 1, 6))
## [1] "character"
这提醒我们,在进行数据操作时,对于键列的数据类型,需要小心一点。

posted @ 2019-02-11 14:06  NAVYSUMMER  阅读(128)  评论(0编辑  收藏  举报
交流群 编程书籍