我有一个巨大的桌子,里面有两个范围(2列),即最小和最大:
1,5
6,10
11,15
等等。我想要一个函数,给定一个数字,它将返回正确范围的两个边界。假设我输入f(12),我喜欢回到11和15。
我想帮助如何在R中构建它。它必须高效,因为表格相对较大(1M行)。
答案 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
,第四个不在结果中。