通过R中的键查询data.table

时间:2014-09-17 13:06:18

标签: r data.table

我已经关注了data.table简介。在data.table的x列上设置密钥,然后查询。我试图在v列上设置密钥,但预期不起作用。对我做错了什么想法?

> set.seed(34)
> DT = data.table(x=c("b","b","b","a","a"),v=rnorm(5))
> DT
   x          v
1: b -0.1388900
2: b  1.1998129
3: b -0.7477224
4: a -0.5752482
5: a -0.2635815
> setkey(DT,v)
> DT[1.1998129,]
   x          v
1: b -0.7477224  

EXPECTED:
   x          v
1: b  1.1998129

1 个答案:

答案 0 :(得分:1)

[.data.table的第一个参数是数字时,它不会进行连接,而是进行简单的行号查找。自setkey你的data.table看起来如此之后:

DT
#   x          v
#1: b -0.7477224
#2: a -0.5752482
#3: a -0.2635815
#4: b -0.1388900
#5: b  1.1998129

由于as.integer(1.1998129)等于1,你得到第一行。

现在,如果您打算进行连接,则必须使用语法DT[J(...)]DT[.(...)],这将按预期工作,前提是您使用正确的数字(为方便起见,您在处理例如字符列时,不需要使用J,因为DT["a"]意味着没有默认含义:

DT[J(v[5])]
#   x        v
#1: b 1.199813

请注意DT[J(1.1998129)]无效,因为:

DT$v[5] == 1.1998129
#[1] FALSE

你可以打印出很多数字,这样可行:

options(digits = 22)
DT$v[5]
#[1] 1.199812896606383683107

DT$v[5] == 1.199812896606383683107
#[1] TRUE

DT[J(1.199812896606383683107)]
#   x                v
#1: b 1.199812896606383683107

但是这里还有一个额外的微妙之处,值得注意的是,R和data.table在浮点数相等时有不同的精度:

DT$v[5] == 1.19981289660638
#[1] FALSE
DT[J(1.19981289660638)]
#   x                       v
#1: b 1.199812896606379908349

长话短说 - 加入浮点数时要小心。