R 通过两个最近的变量合并data.table

R 通过两个最近的变量合并data.table,r,merge,data.table,R,Merge,Data.table,我有两个数据表,其中包含x、y坐标和一些其他信息,我希望根据最近邻距离合并这些信息,即x和y的最小平方差(dx_I=min([(x_I-x_j)^2+(y_I-y_j)^2]^0.5)。假设我有以下两组: DT1=data.table(x=1:5,y=3:7) DT2=data.table(x=c(2,4,2,3,6),y=c(2.5,3.1,2,3,5),Q=c('a','b','c','d','e')) 然后,合并的预期结果将是: x y Q 1: 1 3 a 2: 2 4

我有两个数据表,其中包含x、y坐标和一些其他信息,我希望根据最近邻距离合并这些信息,即x和y的最小平方差(dx_I=min([(x_I-x_j)^2+(y_I-y_j)^2]^0.5)。假设我有以下两组:

DT1=data.table(x=1:5,y=3:7)    
DT2=data.table(x=c(2,4,2,3,6),y=c(2.5,3.1,2,3,5),Q=c('a','b','c','d','e'))
然后,合并的预期结果将是:

   x y Q
1: 1 3 a
2: 2 4 d
3: 3 5 d
4: 4 6 e
5: 5 7 e
当然,我可以在DT1上写一个循环来计算DT1中每一行的最近邻,然后根据此计算进行合并,但这似乎不符合数据表的目的。此外,对于数百万行的数据表来说,这将非常缓慢

我知道,对于单个列,我可以像这样进行最近邻合并

DT2[DT1,roll="nearest"]
但是,当我为要合并的表定义两个键(x和y)时,这(逻辑上)不起作用。是否存在类似于2参数近邻合并的语法?如果不存在,是否有更聪明的方法来实现这一点,然后像我提到的那样循环?

一种可能的解决方案:

func = function(u,v)
{
    vec = with(DT2, (u-x)^2 + (v-y)^2)
    DT2[which.min(vec),]$Q
}

transform(DT1, Q=apply(DT1, 1, function(u) func(u[1], u[2])))

#   x y Q
#1: 1 3 a
#2: 2 4 d
#3: 3 5 d
#4: 4 6 e
#5: 5 7 e

之所以只对1列执行此操作,是因为对于1列,您可以在两个表中对其进行排序,从而便于进行滚动合并。对于2个或更多列,您无法执行此操作(没有排序顺序),而且这是一种全新的操作类型。@eddi是的,我知道该操作将是另一种类型。我只是想知道这是否是(我认为常见的)类型的合并是以某种智能方式实现的,我没有考虑太多——但如果你想出了一个智能算法来实现它,你当然可以在github上添加一个建议或拉请求。