因为您想要每一行的结果a
,你应该像这样加入b[a, ...]
:
b[a, on=.(LB <= salary, UB > salary), nomatch=0,
.(Company_ID, salary, cat, LB = x.LB, UB = x.UB, rep)]
Company_ID salary cat LB UB rep
1: 1 2000 1 0 3000 Bob
2: 1 3000 2 3000 5000 Alice
3: 1 4000 2 3000 5000 Alice
-
nomatch=0
意味着我们将删除行a
是无与伦比的b
.
- 我们需要明确提及
UB
and LB
列来自b
使用x.*
前缀(来自?data.table
文档,其中参数的命名方式如下x[i]
).
关于奇怪的默认列,有一个未解决的问题可以改变这种行为:#1615 https://github.com/Rdatatable/data.table/issues/1615.
(下面提到的问题 #1989 现已修复——请参阅 Uwe 的回答。)
交替...一种应该有效并避免显式列出所有列的方法:添加a
的列b
,然后子集b
:
b[a, on=.(LB <= salary, UB > salary), names(a) := mget(paste0("i.", names(a)))]
b[b[a, on=.(LB <= salary, UB > salary), which=TRUE, nomatch=0]]
这有两个问题。首先,有一个错误会导致非等值连接在遇到以下情况时中断:mget
(#1989 https://github.com/Rdatatable/data.table/issues/1989)。临时解决方法是枚举a
的专栏:
b[a, on=.(LB <= salary, UB > salary), `:=`(Company_ID = i.Company_ID, salary = i.salary)]
b[b[a, on=.(LB <= salary, UB > salary), which=TRUE, nomatch=0]]
其次,执行两次此连接的效率很低(一次用于:=
和第二次which
),但我看不到任何解决办法...也许可以证明功能请求允许两者j
and which
?