gpt4 book ai didi

r - 在 R 中按键查询 data.table

转载 作者:行者123 更新时间:2023-12-04 09:45:38 25 4
gpt4 key购买 nike

我已经关注了data.table的介绍。在 data.table 的 x 列上设置一个键,然后进行查询。我试图在 v 列上设置 key ,但它没有像预期的那样工作。对我做错了什么有什么想法吗?

> 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 的第一个参数是一个数字时,它不会进行连接,而是进行简单的行号查找。因为在 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

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

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

长话短说 - 连接 float 时要小心。

关于r - 在 R 中按键查询 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25891425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com