Неэквивалентное соединение data.table возвращает некоторые столбцы правильно, а некоторые реплицируются с последним найденным значением - PullRequest
0 голосов
/ 05 января 2019

В приведенном ниже примере у меня есть сетка 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...