我想将两个data.tables合并为一个。每个表中有三列(两个坐标x,y和分配给坐标的值),另一个表有两列(两个坐标x和y)。但是,data.tables的坐标略有不同,所以我想合并最近的坐标。但那时只有最近的最近坐标。
我想要做的事情与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 :(得分:1)
引入了data.table v 1.9.8, non-equi 连接。这使得解决这些任务变得相对容易和直接。您基本上只能使用第二个数据框中的 less / equal 坐标来连接这两个坐标,同时只选择最新的匹配(最近的一个,换句话说, )。
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