2016-07-12 37 views
0

我有填充有範圍(2列),即最小和最大一個巨大的表適合:R:有效地找到正確的範圍我的值在

1,5

6,10

11,15 15

等等。我想要一個函數,給定一個數字,將返回正確範圍的兩個邊界。說我輸入f(12),我想回來11和15.

我想幫助如何建立在R它必須是有效的,因爲表是相對較大(1M行)。

+4

'findInterval'就是這裏的一個明顯的工具。 – joran

+0

@joran'findInterval'搜索單個排序的向量。所以在沒有單個排序向量的情況下,它不起作用。這裏的要求是搜索一組範圍。 IIUC。 –

+0

@MattDowle重讀它,我認爲你是對的。 – joran

回答

3

使用新的非相等連接可用的功能在data.table,v1.9.7的開發版本:

require(data.table) # v1.9.7+ 
foo <- function(x, y) { 
    x = setDT(list(x=x))      # convert to data.table 
    x[y, on=.(x >= V1, x <= V2), nomatch=0L] # perform a conditional join 
} 
foo(12, dt) 
#  x x.1 
# 1: 11 15 

其中:

dt = fread('1,5\n6,10\n11,15\n') 
# V1 V2 
# 1: 1 5 
# 2: 6 10 
# 3: 11 15 

參見devel的版本here安裝說明。


注意,對於重複調用,它可能不是有效的,由於調用開銷[.data.table。假設你想要得到的所有區間範圍爲輸入,3,4,12,19,那麼我會做這樣的:

require(data.table) #v1.9.7+ 
x = data.table(x=c(3,4,12,19), id = 1:4) 
x[dt, on=.(x >= V1, x <= V2), nomatch=0L] 
#  x id x.1 
# 1: 1 1 5 
# 2: 1 2 5 
# 3: 11 3 15 

的第一個值(ID = 1)在[1,5],所以是第二個值(id = 2)。第三位在[11,15]。第四個是由於nomatch=0而導致的結果。