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

时间:2015-02-10 15:11:57

标签: 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 d
3: 3 5 d
4: 4 6 e
5: 5 7 e

我当然可以在DT1上编写一个循环来计算DT1中每行的最近邻居,然后根据这个计算进行合并,但这似乎打败了数据表的目的。而且,对于数百万行的数据表来说,这将非常缓慢。

我知道对于单个列我可以像这样做

进行最近邻居合并
DT2[DT1,roll="nearest"]

但是,当我为要合并的表定义2个键(x和y)时,(逻辑上)不起作用。是否存在2参数最近邻居合并的类似语法?如果没有,是否有更聪明的方法来做这个然后循环,就像我提到的那样?

1 个答案:

答案 0 :(得分:4)

一种可能的解决方案:

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
相关问题