假设我有几个区间是实线的子集,如下所示:
I_1 = [0, 1]
I_2 = [1.5, 2]
I_3 = [5, 9]
I_4 = [13, 16]
现在给出一个实数x = 6.4
,比方说,我想找出哪个区间包含数字x
。我想知道找到这个间隔的算法,和/或如何在R中执行此操作。
提前致谢。
答案 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
中的每个时间间隔是否完全位于DT1
内DT2
。在您的情况下,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}}