使用键获取行

data.table 的另一个独特功能是它的索引支持,也就是说,我们可以在 data.table 中
创建键(key),通过键获取记录极其高效。例如,使用 setkey( ) 将 id 设置
为 product_info 中的一个键:
setkey(product_info, id)
注意到,这个函数的行为与 R 的大部分函数行为都不同。它并没有返回一
个 data.table 的副本,而是直接为原始输入数据设置了键。而原来的数据框看起来似
乎没有变化:
product_info
## id name type class released
## 1: M01 JeepX model vehicle TRUE
## 2: M02 AircraftX model vehicle TRUE
## 3: M03 Runner model people TRUE
## 4: M04 Dancer model people FALSE
## 5: T01 SupCar toy vehicle TRUE
## 6: T02 SupPlane toy vehicle FALSE
但是,它的键已经生成了:
key(product_info)
## [1] "id"
现在,我们可以用键来获取记录了。例如,可以直接提供一个 id 值来获取对应记录:
product_info["M01"]
## id name type class released
## 1: M01 JeepX model vehicle TRUE
但是,如果我们对没有设置 key 的 data.table 使用以上用法,程序就会报错,并
提醒你需要设置键:
product_stats["M01"]
## Error in `[.data.table`(product_stats, "M01"): When i is a data.table
(or character vector), x must be keyed (i.e. sorted, and, marked as sorted)
so data.table knows which columns to join to and take advantage of x being
sorted. Call setkey(x,...) first, see ?setkey.
也可以使用 setkeyv( ) 来设置键,但是它只接受字符向量:
setkeyv(product_stats, "id")
当 key 是一个动态变化的向量时,这个函数就特别好用。现在,我们也可以用键获
取 product_stats 的数据了:
product_stats["M02"]
## id material size weight density
## 1: M02 Plastics 85 3 28.33333
如果两个表格有相同的键,我们可以轻松地将它们连接在一起:
product_info[product_stats]
## id name type class released material size
## 1: M01 JeepX model vehicle TRUE Plastics 50
## 2: M02 AircraftX model vehicle TRUE Plastics 85
## 3: M03 Runner model people TRUE Wood 15
## 4: M04 Dancer model people FALSE Wood 16
## 5: T01 SupCar toy vehicle TRUE Metal 120
## 6: T02 SupPlane toy vehicle FALSE Metal 350
## weight density
## 1: NA NA
## 2: 3.0 28.333333
## 3: NA NA
## 4: 0.6 26.666667
## 5: 10.0 12.000000
## 6: 45.0 7.777778
data.table 的键可以不止一个。例如,需要通过指定 id 和 date,定位 toy_tests 中
的一条记录。在以下代码中,我们在 toy_tests 中把这两列设置为一个键:
setkey(toy_tests, id, date)
现在,提供 key 中的两个元素,就可以获得一行记录了:
toy_tests[.("T01", 20160201)]
## id date sample quality durability
## 1: T01 20160201 100 9 9
如果我们只提供第 1 个元素,便会得到由匹配了第 1 个元素的所有记录构成的数据
子集:
toy_tests["T01"]
## id date sample quality durability
## 1: T01 20160201 100 9 9
## 2: T01 20160302 150 10 9
## 3: T01 20160405 180 9 10
## 4: T01 20160502 140 9 9
然而,如果只提供了第 2 个元素,便会返回错误信息。这是因为算法背后要求键必须
按顺序排列:
toy_tests[.(20160201)]
## Error in bmerge(i, x, leftcols, rightcols, io, xo, roll, rollends,
nomatch, : x.'id' is a character column being joined to i.'V1' which is type
'double'. Character columns must join to factor or character columns.
同样地,如果以错误顺序提供了一个键,也无法得到任何数据:
toy_tests[.(20160201, "T01")]
## Error in bmerge(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, :
x.'id' is a character column being joined to i.'V1' which is type 'double'.
Character columns must join to factor or character columns.

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