0
我有填充有範圍(2列),即最小和最大一個巨大的表適合:R:有效地找到正確的範圍我的值在
1,5
6,10
11,15 15
等等。我想要一個函數,給定一個數字,將返回正確範圍的兩個邊界。說我輸入f(12),我想回來11和15.
我想幫助如何建立在R它必須是有效的,因爲表是相對較大(1M行)。
我有填充有範圍(2列),即最小和最大一個巨大的表適合:R:有效地找到正確的範圍我的值在
1,5
6,10
11,15 15
等等。我想要一個函數,給定一個數字,將返回正確範圍的兩個邊界。說我輸入f(12),我想回來11和15.
我想幫助如何建立在R它必須是有效的,因爲表是相對較大(1M行)。
使用新的非相等連接可用的功能在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
而導致的結果。
'findInterval'就是這裏的一個明顯的工具。 – joran
@joran'findInterval'搜索單個排序的向量。所以在沒有單個排序向量的情況下,它不起作用。這裏的要求是搜索一組範圍。 IIUC。 –
@MattDowle重讀它,我認爲你是對的。 – joran