在我的数据集中,我有一些点,它们的位置由XY给出,它们由ID分组.我想计算每个点到其他组中点的最近邻(NN)距离.换句话说,如果一个点的ID1,代码应该从满足ID != 1的点搜索NND.

伪R代码可能如下所示:

DT[DT, c("nn_dist", "nn_X", "nn_Y") := find_NNN(data.table(i.X, i.Y), .SD[ID != i.ID]), by = .EACHI]

为了实现这一点,我try 用循环之类的方式编写命令式代码,但速度太慢了.我try 使用FNN库中的get.knnx函数,但后来我不知道如何获得NN距离和NN的位置.

如何在相对较大(约10000行)的数据集上进行此计算?

这是我正在使用的数据集的一小部分

structure(list(ID = c(1L, 1L, 2L, 2L), X = c(318L, 317L, 1273L, 
1272L), Y = c(1L, 2L, 1L, 2L), t = c(1, 1, 1, 1), uid = c(1L, 
2L, 1271L, 1272L)), row.names = c(NA, -4L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x7f89b481f0e0>)
  • 对于数据集中的所有点,t列是相同的
  • uid是给定给每个点的唯一id,无论其位置或组如何,因此max(uid)等于数据集中的#行

推荐答案

您可以创建一个小距离函数,传递xy和所有候选点的数据帧d(即其他id组中所有点的x和y值),并返回最近组间点的坐标和uid

dist <- function(x,y,d) d[order(d[,sqrt((X-x)^2 + (Y-y)^2)])][1]

然后将该函数应用于框架

df[, c("nnX", "nnY", "nn"):=dist(X,Y, df[ID!=.BY$ID,.(X,Y,uid)]),by=.(ID,uid)]

输出:

   ID    X Y t  uid  nnX nnY   nn
1:  1  318 1 1    1 1272   2 1272
2:  1  317 2 1    2 1272   2 1272
3:  2 1273 1 1 1271  318   1    1
4:  2 1272 2 1 1272  318   1    1

如果您还需要到最近邻居的距离,您可以更新函数和对函数的调用,如下所示:

dist <- function(x,y,d) {
  d[, nn_dist:=sqrt((X-x)^2 + (Y-y)^2)][order(nn_dist)][1]
}
df[, c("nnX", "nnY", "nn", "nn_dist"):=dist(X,Y, df[ID!=.BY$ID,.(X,Y,uid)]),by=.(ID,uid)]

输出:

   ID    X Y t  uid  nnX nnY   nn  nn_dist
1:  1  318 1 1    1 1272   2 1272 954.0005
2:  1  317 2 1    2 1272   2 1272 955.0000
3:  2 1273 1 1 1271  318   1    1 955.0000
4:  2 1272 2 1 1272  318   1    1 954.0005

或者,您可以使用第一个函数,并使用df[, nn_dist := sqrt((X-nnX)^2 + (Y-nnY)^2)]来估计末端的距离

R相关问答推荐

如何根据条件计算时差(天)

以R中的正确顺序将日期时间字符列转换为posixct

为什么在ggplot2中添加geom_text这么慢?

使用tidy—select创建一个新的带有mutate的摘要变量

使用strsplit()将向量操作为数据框

删除具有相同标题的tabPanel(shinly)

非线性混合效应模型(NLME)预测变量的置信区间

如何通过判断数据框的一列来压缩另一列?

将二进制数据库转换为频率表

如何在R中通过多个变量创建交叉表?

安全地测试文件是否通过R打开

提高圣彼得堡模拟的速度

为什么我对圆周率图的蒙特卡罗估计是空的?

在使用SliderInput In Shiny(R)设置输入数据的子集时,保留一些情节痕迹

Ggplot2如何找到存储在对象中的残差和拟合值?

如何获取R chromote中的当前URL?

无法保存gglot的所有pdf元素

R data.设置函数&;连接中的列值而不使用for循环的表方法?

使用`ggsurvfit::ggsurvfit()`

对数据帧中的大量组合执行Kruskal-Wallis测试