【问题标题】:Query data.table by key in R在R中按键查询data.table
【发布时间】:2014-09-17 13:06:18
【问题描述】:

我遵循了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

【问题讨论】:

  • @poiuytrez 我猜是FAQ7.29。 DT[5,v]-1.1998129#[1] -3.393616e-09 。如果将该列v 转换为character and then do setkey(..)`,您可能不会遇到同样的问题`
  • @DavidArenburg DT[J()] 的奇怪之处在于浮动错误。如果您尝试DT[J(DT$v[5])],您将得到正确的结果。
  • @akrun FAQ 7.29 在哪里?
  • @poiuytrez 其实是FAQ7.31 http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f

标签: r data.table


【解决方案1】:

[.data.table的第一个参数是数字时,它不会做join,而是简单的行号查找。因为在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

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

【讨论】:

  • 这是1.9.3吗?如果是这样,做setNumericRounding(0L)之后的精度如何?
  • @Arun 是的,1.9.3。按照您的建议设置精度后,两者匹配。
猜你喜欢
  • 1970-01-01
  • 2011-08-16
  • 2023-03-11
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
相关资源
最近更新 更多