R:有效地找到我的值适合的正确范围

时间:2016-07-12 15:27:58

标签: r performance

我有一个巨大的桌子,里面有两个范围(2列),即最小和最大:

  

1,5

     

6,10

     11,15

等等。我想要一个函数,给定一个数字,它将返回正确范围的两个边界。假设我输入f(12),我喜欢回到11和15。

我想帮助如何在R中构建它。它必须高效,因为表格相对较大(1M行)。

1 个答案:

答案 0 :(得分:3)

使用当前开发版本的data.table,v1.9.7中提供的新的非equi连接功能:

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,第四个不在结果中。