找到合适的间隔

时间:2014-11-15 09:48:41

标签: r algorithm

假设我有几个区间是实线的子集,如下所示:

I_1 = [0, 1]
I_2 = [1.5, 2]
I_3 = [5, 9]
I_4 = [13, 16]

现在给出一个实数x = 6.4,比方说,我想找出哪个区间包含数字x。我想知道找到这个间隔的算法,和/或如何在R中执行此操作。

提前致谢。

1 个答案:

答案 0 :(得分:1)

使用非equi连接进行更新:

使用current development version of data.table, v1.9.7中新的 non-equi 连接功能,这更简单直接:

require(data.table) # v1.9.7+
DT1 = data.table(start=c(0,1.5,5,1,2,3,4,5), end=c(1,2,9,2,3,4,5,6))

DT1[.(x=4.5), on=.(start<=x, end>=x), which=TRUE]
# [1] 7

无需设置键或创建索引。


使用foverlaps的旧解决方案:

一种方法是使用data.table包使用间隔/重叠连接:

require(data.table) ## 1.9.4+
DT1 = data.table(start=c(0,1.5,5,13), end=c(1,2,9,16))
DT2 = data.table(start=6.4, end=6.4)

setkey(DT1)
foverlaps(DT2, DT1, which=TRUE, type="within")
#    xid yid
# 1:   1   3

此搜索DT2中的每个时间间隔是否完全位于DT1DT2。在您的情况下,DT1是一个点,而不是间隔。如果NA中的任何时间间隔内不存在,则返回?foverlaps

查看mult=以查看您可以使用的其他参数。例如setkey参数控制,如果你想要返回所有匹配的行,或只是返回第一个或最后一个等等。


由于id对结果进行排序,您必须按如下方式添加单独的DT1 = data.table(start=c(0,1.5,5,1,2,3,4,5), end=c(1,2,9,2,3,4,5,6)) DT1[, id := .I] # .I is a special variable. See ?data.table setkey(DT1, start, end) DT2 = data.table(start=4.5 ,end=4.5) olaps = foverlaps(DT2, DT1, type="within", which=TRUE) olaps[, yid := DT1$id[yid]] # xid yid # 1: 1 7

{{1}}