В приведенном ниже примере у меня есть сетка 5x5 (A
) и 3 точки (B
), идентифицированные с их соответствующими координатами.
Предполагаемый результат - список всех точек из A, которые находятся на расстоянии 1 сетки от каждой из точек из B. Именно здесь на помощь приходит неэквивалентное соединение. В целом - работает как задумано. В полученной таблице (result
) у меня есть правильные идентификаторы точек и правильные идентификаторы сетки, и я мог бы работать с этим дальше.
Меня беспокоит столбцы x
и y
в result
. Предполагалось, что они будут координатами совпадающих 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