Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按R中的键查询data.table_R_Data.table - Fatal编程技术网

按R中的键查询data.table

按R中的键查询data.table,r,data.table,R,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

我遵循了数据表的介绍。在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

[.data.table
的第一个参数是一个数字时,它不会执行联接,而是执行简单的行号查找。因为在
设置键之后,您的
数据。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(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和
数据。当浮点数相等时,表
具有不同的精度:

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

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

@pouytrez我想这是常见问题7.29。
DT[5,v]-1.1998129#[1]-3.393616e-09
。如果你将该列
v
转换为
字符,然后执行
设置键(…)`@DavidArenburg关于
DT[J()的奇怪事情,你可能不会遇到同样的问题
是由于浮动错误造成的。如果您尝试
DT[J(DT$v[5])]
您得到了正确的结果。@akrun常见问题解答7.29在哪里?@poiuytrez实际上,它是常见问题解答7.31
http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-这些数字是否相等?这是
1.9.3
吗?如果是,在执行
设置数值微调(0L)后,精度如何
?@Arun是的,1.9.3。按照您的建议设置精度后,两者匹配。
DT$v[5] == 1.19981289660638
#[1] FALSE
DT[J(1.19981289660638)]
#   x                       v
#1: b 1.199812896606379908349