首页 > 解决方案 > data.table 非等价连接正确返回了一些列,并使用最后找到的值复制了一些列

问题描述

在下面的示例中,我有 5x5 网格 ( A) 和 3 个点 ( B),并带有它们各自的坐标。

预期的结果是 A 中与 B 中的每个点相距 1 格的所有点的列表。这就是非等价连接的用武之地。一般来说 - 它按预期工作。在结果表 ( result) 中,我有正确的点 ID 和正确的网格 ID,我可以进一步使用它。

困扰我xyresult. 它们应该是 match 的坐标grid_id(查看grid_id输出中的列 - 它们在那里,正确!),但是,它们似乎被卡住了,并且每个点的最后一个匹配点来自A. 我应该改变什么来使 x 和 y 作为对应于它们的值grid_id,除了另一个连接?

这是我对 data.table 的第一种方法,但我需要它以在几百万行上获得更好的性能。

library(tidyverse)
library(magrittr)
library(data.table)

limit <- 1

A <- expand.grid(x = c(1,2,3,4,5), y = c(1,2,3,4,5)) %>%
  mutate(
    grid_id = paste(x,y) # just some values
  ) %>%
  as.data.table(.)

B <- data.frame(
    ID = c(1,2,3),     
    xb = c(2,3,4), 
    yb = c(2,3,4)
  ) %>% 
  mutate(
      x_upper = xb + limit
    , x_lower = xb - limit
    , y_upper = yb + limit
    , y_lower = yb - limit
) %>%
  as.data.table(.)

result <- A[B, 
       on = .(x >= x_lower, x <= x_upper, y >= y_lower, y <= y_upper),
       .(x, y, xb, yb, ID, grid_id)]

电流输出如下:

> result
    x y xb yb  ID grid_id
 1: 3 3  2  2 2_2     1 1
 2: 3 3  2  2 2_2     2 1
 3: 3 3  2  2 2_2     3 1
 4: 3 3  2  2 2_2     1 2
 5: 3 3  2  2 2_2     2 2
 6: 3 3  2  2 2_2     3 2
 7: 3 3  2  2 2_2     1 3
 8: 3 3  2  2 2_2     2 3
 9: 3 3  2  2 2_2     3 3
10: 4 4  3  3 3_3     2 2
11: 4 4  3  3 3_3     3 2
12: 4 4  3  3 3_3     4 2
13: 4 4  3  3 3_3     2 3
14: 4 4  3  3 3_3     3 3
15: 4 4  3  3 3_3     4 3
16: 4 4  3  3 3_3     2 4
17: 4 4  3  3 3_3     3 4
18: 4 4  3  3 3_3     4 4
19: 5 5  4  4 4_4     3 3
20: 5 5  4  4 4_4     4 3
21: 5 5  4  4 4_4     5 3
22: 5 5  4  4 4_4     3 4
23: 5 5  4  4 4_4     4 4
24: 5 5  4  4 4_4     5 4
25: 5 5  4  4 4_4     3 5
26: 5 5  4  4 4_4     4 5
27: 5 5  4  4 4_4     5 5
    x y xb yb  ID grid_id

标签: rjoindata.table

解决方案


推荐阅读