2015-02-10 57 views
6

我有兩個數據表,其中包含x,y座標以及其他一些我想根據最近鄰距離合並的信息,即x和y的平方差最小值。dx_i =分鐘([(X_I-x_j)^ 2 +(Y_I-y_j)^ 2]^0.5)說我有下列兩組:將data.table合併兩個最接近的變量

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參數最近鄰居合併的類似語法?如果沒有,是否有更聰明的方法來做到這一點,然後循環,就像我提到的那樣?

+2

的原因,它的唯一的1列完成,是因爲1列,您可以在兩個表中排序它,使它很容易做到滾動合併。對於2列或更多列,你不能這樣做(沒有排序順序),它是一種全新的操作類型。 – eddi 2015-02-10 16:21:08

+0

@eddi是的,我知道這個操作是不同的類型。我只是想知道,這種(我認爲常見的)合併類型是以一種智能的方式實現的 – Michiel 2015-02-11 09:10:30

+0

我沒有想太多 - 但如果你想出了一個聰明的算法來做到這一點,你當然可以添加一個建議或github上的拉取請求。 – eddi 2015-02-11 15:41:49

回答

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