【问题标题】:Merge data.table by two LOWEST nearest variables通过两个 LOWEST 最近的变量合并 data.table
【发布时间】:2018-01-12 02:11:54
【问题描述】:

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

我希望这能说明我想要什么。谢谢

【问题讨论】:

  • 对不起,我不认为我完全理解你的问题......你能举一个你希望达到的输出的例子吗?
  • 对不起,我没说清楚,我会在我的问题中更改示例数据集
  • 请测试您的代码。 DT2 报错。
  • 抱歉 - 我是 stackoverflow 的新手。现已更正

标签: r dataframe merge data.table


【解决方案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

【讨论】:

  • 对不起,我从来没有说过谢谢!但这很棒,而且奏效了!
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2013-12-26
  • 2015-02-07
  • 2012-09-23
  • 2015-07-04
  • 2018-06-17
  • 1970-01-01
相关资源
最近更新 更多