您可以创建一个传递的小距离函数x
, y
,和一个数据框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)]
Output:
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)]
Output:
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)]