【问题标题】:Merge data.table by two nearest variables通过两个最近的变量合并 data.table
【发布时间】:2023-03-19 00:06:02
【问题描述】:

我有两个数据表,其中包含 x,y 坐标和其他一些我想根据最近邻距离合并的信息,即 x 和 y 的平方差的最小值 (dx_i =min ([(x_i- x_j)^2+(y_i-y_j)^2]^0.5). 假设我有以下两组:

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 参数最近邻合并的类似语法?如果没有,有没有更聪明的方法来做到这一点,然后只是循环,就像我提到的那样?

【问题讨论】:

  • 之所以只对 1 列进行,是因为对于 1 列,您可以在两个表中对其进行排序,从而可以轻松进行滚动合并。对于 2 列或更多列,您不能这样做(没有排序顺序),这是一种全新的操作类型。
  • @eddi 是的,我知道该操作将属于不同类型。我只是想知道这种(我认为常见的)合并类型是否以某种聪明的方式实现
  • 我并没有想太多——但如果你想出一个聪明的算法来做这件事,你当然可以在 github 上添加建议或拉取请求。

标签: r merge data.table


【解决方案1】:

一种可能的解决方案:

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

【讨论】:

    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 2013-12-26
    • 2015-02-07
    • 2012-09-23
    • 2015-07-04
    • 2018-06-17
    • 1970-01-01
    相关资源
    最近更新 更多