2017-08-04 100 views
1

我想將兩個data.tables合併爲一個。每個表中有三列(兩個座標x,y和一個賦值給座標的值),另一個表有兩列(兩個座標x和y)。但是,data.tables的座標略有不同,所以我想合併最近的座標。但是,只有最接近的座標。將data.table合併兩個LOWEST最接近的變量

我想要做的事情與Michiel(this thread)非常相似,如果我想擁有更低或更近的解決方案,該解決方案適用於我。但是,正如我之前所解釋的,我想在最靠近的位置滾動,其中data.table的功能是roll = Inf。

任何人的想法如何我可以重寫在另一個線程中提出的功能,或者是否有另一個功能可以幫助我。

這是數據的一個例子:

DT1 = data.frame(x=c(1,2,3,4,5,6,7,8,9,9,10),y=c(11,11,11,11,11,12,12,12,12,16,15)) 
DT2 = data.frame(x=c(1,1,1,6,6,6,10,10),y=c(11,12,13,11,12,13,14,16), name=c("A","B","C","D","E","F","G","H")) 

繼前一個線程的功能,你會得到這樣的:

x y name 
1: 1 11 A 
2: 2 11 A 
3: 3 11 A 
4: 4 11 D 
5: 5 11 D 
6: 6 12 E 
7: 7 12 E 
8: 8 12 E 
9: 9 12 G 
10: 9 16 G 
11: 10 15 G 

但我想是這樣的:

x y name 
1: 1 11 A 
2: 2 11 A 
3: 3 11 A 
4: 4 11 **A** # Lowest nearest value of x:4 is 1 (A) not 6 (E) 
5: 5 11 **A** # Lowest nearest value of x:5 is 1 (A) not 6 (E) 
6: 6 12 E 
7: 7 12 E 
8: 8 12 E 
9: 9 12 **E** # Lowest nearest value of x:9 is 6, and of y:12 is 12 thus E 
10: 9 16 **F** # Lowest nearest value of x:9 is 6, and of y:16 is 15 thus F 
11: 10 15 G 

我希望這能說明我想要的。由於

+0

對不起,我不認爲我完全理解你的問題......你能舉出一個你希望達到的輸出的例子嗎? – zwep

+0

對不起,我不清楚,我會更改我的問題中的示例數據集 – AnoukStats

+0

請測試您的代碼。 DT2發生錯誤。 – Frank

回答

1

開始data.table v 1.9.8,非等距加入進行了介紹。這使得解決這些任務相對簡單而直接。換句話說,只能選擇最近的匹配(最接近的之一),您可以基本上只通過這兩個座標加入第二個數據幀的座標爲的座標(小於/等於)。

library(data.table) #v 1.10.4 
setDT(DT2)[setDT(DT1), on = .(x <= x, y <= y), mult = "last"] 
#  x y name 
# 1: 1 11 A 
# 2: 2 11 A 
# 3: 3 11 A 
# 4: 4 11 A 
# 5: 5 11 A 
# 6: 6 12 E 
# 7: 7 12 E 
# 8: 8 12 E 
# 9: 9 12 E 
# 10: 9 16 F 
# 11: 10 15 G 
+0

對不起,我從來沒有說過謝謝!但是,這是偉大的,它的工作! – AnoukStats