-1
想我再也幾個區間實招行的子集,如下所示:尋找合適的區間
I_1 = [0, 1]
I_2 = [1.5, 2]
I_3 = [5, 9]
I_4 = [13, 16]
現在給出一個實數x = 6.4
,比方說,我想找到這區間包含數x
。我想知道算法找到這個間隔,和/或如何做到這一點在R.
在此先感謝。
想我再也幾個區間實招行的子集,如下所示:尋找合適的區間
I_1 = [0, 1]
I_2 = [1.5, 2]
I_3 = [5, 9]
I_4 = [13, 16]
現在給出一個實數x = 6.4
,比方說,我想找到這區間包含數x
。我想知道算法找到這個間隔,和/或如何做到這一點在R.
在此先感謝。
更新使用非相等連接條件:
這是更簡單,使用新非等距加入在current development version of data.table, v1.9.7功能簡單:
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
感謝您的幫助。 – Janak
@阿倫......感謝您的關注。這是一個使用上述代碼的問題。 > DT1 = data.table(start = c(0,1.5,5,1,2,3,4,5),end = c(1,2,9,2,3,4,5,6)) > DT2 = data.table(start = 4.5,end = 4.5) > setkey(DT1) > foverlaps(DT2,DT1,which = TRUE,type =「within」) > xid yid 1:1 5 2 :1 6 – Janak
上面的答案肯定是不正確的......答案應該是7.但它是給5和6.我找不出它爲什麼不起作用。 – Janak