R data.table中整数64的二进制搜索

R data.table中整数64的二进制搜索,r,data.table,binary-search,integer64,R,Data.table,Binary Search,Integer64,我有一个integer64索引数据。表对象: library(data.table) library(bit64) some_data = as.integer64(c(1514772184120000026, 1514772184120000068, 1514772184120000042, 1514772184120000078,1514772184120000011, 1514772184120000043, 1514772184120000094, 151477218412000008

我有一个
integer64
索引
数据。表
对象:

library(data.table)
library(bit64)

some_data = as.integer64(c(1514772184120000026, 1514772184120000068, 1514772184120000042, 1514772184120000078,1514772184120000011, 1514772184120000043, 1514772184120000094, 1514772184120000085,
1514772184120000083, 1514772184120000017, 1514772184120000013, 1514772184120000060, 1514772184120000032, 1514772184120000059, 1514772184120000029))

#
n <- 10
x <- setDT(data.frame(a = runif(n)))
x[, new_col := some_data[1:n]]
setorder(x, new_col)
如果这些是本机整数,我可以使用
findInterval()
来解决问题:

values_index  <- findInterval(search_values, x$new_col)
和错误的索引:

> values_index
[1] 10 10 10 10 10
e、 g.
search\u value
的条目都大于
x$new\u col
的所有条目,这是不正确的

编辑: 期望输出:

print(values_index)
9 10  6 10  1
为什么


value\u index
的条目数与
search\u value
的条目数相同。对于
search\u values
的每个条目,
value\u index
中的相应条目给出了
search\u values
条目插入
x$new\u col
时的排名。因此
value\u index
的第一个条目是
9
,因为
search\u values
1514772184120000045
)的第一个条目在
x$new\u col

的条目中排名
9
,如果我得到了你想要的,那么一个快速的解决方法可能是:

toadd <- search_values[!(search_values %in% x$new_col)] # search_values that is not in data
x[, i := .I] # mark the original data set
x <- rbindlist(list(x, data.table(new_col = toadd)),
               use.names = T, fill = T) # add missing search_values
setkey(x, new_col) # order
x[, index := new_col %in% search_values] # mark where the values are
x[, index := cumsum(index)] # get indexes
x <- x[!is.na(i)] # remove added rows
x$index # should contain your desired output

添加如果我得到了您想要的,那么快速解决方法可能是:

toadd <- search_values[!(search_values %in% x$new_col)] # search_values that is not in data
x[, i := .I] # mark the original data set
x <- rbindlist(list(x, data.table(new_col = toadd)),
               use.names = T, fill = T) # add missing search_values
setkey(x, new_col) # order
x[, index := new_col %in% search_values] # mark where the values are
x[, index := cumsum(index)] # get indexes
x <- x[!is.na(i)] # remove added rows
x$index # should contain your desired output

添加也许你想要这样的东西:

findInterval2 <- function(y, x) {
  toadd <- y[!(y %in% x$new_col)] # search_values that is not in data
  x2 <- copy(x)
  x2[, i := .I] # mark the original data set
  x2 <- rbindlist(list(x2, data.table(new_col = toadd)),
                  use.names = T, fill = T) # add missing search_values
  setkey(x2, new_col) # order
  x2[, index := cumsum(!is.na(i))]
  x2[match(y, new_col), index]
}
# x2 is:
#              a             new_col  i index
#  1: 0.56602278 1514772184120000011  1     1
#  2:         NA 1514772184120000013 NA     1
#  3: 0.29408237 1514772184120000017  2     2
#  4: 0.28532378 1514772184120000026  3     3
#  5:         NA 1514772184120000029 NA     3
#  6:         NA 1514772184120000032 NA     3
#  7: 0.66844754 1514772184120000042  4     4
#  8: 0.83008829 1514772184120000043  5     5
#  9:         NA 1514772184120000059 NA     5
# 10:         NA 1514772184120000060 NA     5
# 11: 0.76992760 1514772184120000068  6     6
# 12: 0.57049677 1514772184120000078  7     7
# 13: 0.14406169 1514772184120000083  8     8
# 14: 0.02044602 1514772184120000085  9     9
# 15: 0.68016024 1514772184120000094 10    10
findInterval2(search_values, x)
# [1] 1 5 3 5 3

也许你想要这样的东西:

findInterval2 <- function(y, x) {
  toadd <- y[!(y %in% x$new_col)] # search_values that is not in data
  x2 <- copy(x)
  x2[, i := .I] # mark the original data set
  x2 <- rbindlist(list(x2, data.table(new_col = toadd)),
                  use.names = T, fill = T) # add missing search_values
  setkey(x2, new_col) # order
  x2[, index := cumsum(!is.na(i))]
  x2[match(y, new_col), index]
}
# x2 is:
#              a             new_col  i index
#  1: 0.56602278 1514772184120000011  1     1
#  2:         NA 1514772184120000013 NA     1
#  3: 0.29408237 1514772184120000017  2     2
#  4: 0.28532378 1514772184120000026  3     3
#  5:         NA 1514772184120000029 NA     3
#  6:         NA 1514772184120000032 NA     3
#  7: 0.66844754 1514772184120000042  4     4
#  8: 0.83008829 1514772184120000043  5     5
#  9:         NA 1514772184120000059 NA     5
# 10:         NA 1514772184120000060 NA     5
# 11: 0.76992760 1514772184120000068  6     6
# 12: 0.57049677 1514772184120000078  7     7
# 13: 0.14406169 1514772184120000083  8     8
# 14: 0.02044602 1514772184120000085  9     9
# 15: 0.68016024 1514772184120000094 10    10
findInterval2(search_values, x)
# [1] 1 5 3 5 3


你能用fixed
now
变量编辑你的示例并显示你想要的输出吗?@minem:我的编辑是否针对你的评论?你想要的输出是什么?你能用fixed
now
变量编辑你的示例并显示你想要的输出吗?@minem:我的编辑是否针对你的评论?你想要的输出是什么?对不起,我不得不这么做运行并可以立即查看您的评论。不幸的是,
x$index
不是我想要的。我编辑了问题。很抱歉,我必须运行,现在可以看到您的评论。不幸的是,
x$index
不是我想要的。我编辑了问题。谢谢,但正如您所看到的,输出不是预期的。@user189035请再次查看您的示例数据!没有1514772184120000045值。若要查看问题,请在测试代码中执行以下更改:
now@no,您不明白我在说什么。目前findInterval2应该适用于integer64和integer。测试一下。整数的示例仅显示函数执行findInterval所执行的操作。但也许你一直都想得到不同的结果?对不起。请给我一点时间来评估您的答案(我转到了另一个子任务:我将尽快返回此任务),谢谢,但正如您所看到的,输出不是预期的。@user189035请再次查看您的示例数据!没有1514772184120000045值。若要查看问题,请在测试代码中执行以下更改:
now@no,您不明白我在说什么。目前findInterval2应该适用于integer64和integer。测试一下。整数的示例仅显示函数执行findInterval所执行的操作。但也许你一直都想得到不同的结果?对不起。请给我一点时间来评估你的答案(我转到了另一个子任务:我会尽快回来)
now <- 10
n <- 10
n2 <- 10
some_data = as.integer(now + sample.int(n + n2, n + n2))
x <- setDT(data.frame(a = runif(n)))
x[, new_col := some_data[1:n]]
setorder(x, new_col)
search_values <- some_data[(n + 1):length(some_data)]

r1 <- findInterval2(search_values, x)
r2 <- findInterval(search_values, x$new_col)
all.equal(r1, r2)