我有两个数据表,其中包含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参数最近邻居合并的类似语法?如果没有,是否有更聪明的方法来做这个然后循环,就像我提到的那样?
答案 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