2014-11-15 54 views
-1

想我再也幾個區間實招行的子集,如下所示:尋找合適的區間

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

現在給出一個實數x = 6.4,比方說,我想找到這區間包含數x 。我想知道算法找到這個間隔,和/或如何做到這一點在R.

在此先感謝。

回答

1

更新使用非相等連接條件:

這是更簡單,使用新非等距加入在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 
+0

感謝您的幫助。 – Janak

+0

@阿倫......感謝您的關注。這是一個使用上述代碼的問題。 > 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

+0

上面的答案肯定是不正確的......答案應該是7.但它是給5和6.我找不出它爲什麼不起作用。 – Janak