在下面的示例中,我有5x5网格(A
)和3个点(B
),并分别指定了它们的坐标。
预期结果是A的所有点的列表,这些点与B的每个点相距1格。这是进行非等价合并的地方。一般来说-它可以按预期工作。在结果表(result
中,我具有正确的点ID和正确的网格ID,可以继续使用。
困扰我的是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