r - data.table 非等价连接正确返回了一些列,并使用最后找到的值复制了一些列
问题描述
在下面的示例中,我有 5x5 网格 ( A
) 和 3 个点 ( B
),并带有它们各自的坐标。
预期的结果是 A 中与 B 中的每个点相距 1 格的所有点的列表。这就是非等价连接的用武之地。一般来说 - 它按预期工作。在结果表 ( result
) 中,我有正确的点 ID 和正确的网格 ID,我可以进一步使用它。
困扰我x
的y
是result
. 它们应该是 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
解决方案
推荐阅读
- php - PHP - 使用文本文件中的名称集显示目录
- c# - 为什么在 Unity 中使用“as Gameobject”进行实例化时,此静态实例返回 null?
- c++builder - 我们可以在 c++ builder 6 中使用 HTTPS 吗?安装的 INDY 仅用于 HTTP 请求
- flutter - 如何在flutter中查看点赞帖子的用户列表?
- java - 如何修复此 Java Loop Scanner
- c# - MarshalAs 用于结构中的属性
- python - 如何根据第一次出现的列条件执行分组并删除重复项?
- python-3.x - 使用请求库python搜索标题中包含特定字符串的git问题
- react-native - 在堆栈导航器中隐藏标题
- pine-script - Pine 脚本检查条件