data.table非等效联接正确返回一些列,并使用最后找到的值复制一些列

时间:2019-01-05 18:19:51

标签: r join data.table

在下面的示例中,我有5x5网格(A)和3个点(B),并分别指定了它们的坐标。

预期结果是A的所有点的列表,这些点与B的每个点相距1格。这是进行非等价合并的地方。一般来说-它可以按预期工作。在结果表(result中,我具有正确的点ID和正确的网格ID,可以继续使用。

困扰我的是x中的yresult列。它们应该是匹配的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

0 个答案:

没有答案