通过两个最近的最近变量

时间:2017-08-04 08:21:08

标签: r dataframe merge data.table

我想将两个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

我希望这能澄清我想要的东西。感谢

1 个答案:

答案 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