R-最近的邻居(坐标对之间的距离)



i有2个数据集(每个组都有多个行(单个单元格),x,y坐标为列),我想找到数据集中每个单元格的最小距离到数据集中的任何单元b。

示例DSA = 0,0 0,1 1,0DSB集b = 2,2

要找到从A到B中的单元格的距离(d)我做了

ax <- DS1$X
ay <- DS1$Y
bx <- DS2$X
by <- DS2$Y
D <- c(sqrt((ax-bx)^2 + (ay-by)^2))
D
[1] 2.828427 2.236068 2.236068

所以它确实给了我我需要的东西,但是如果没有DSB有多个点,我会遇到问题

我需要添加一个循环,以便它通过所有BSB值尝试所有DSA值?

目前,它将仅在DSA中的第一个点提高DSB中的第一个点,然后将DSA的第二个值仅由DSB的第二个值。我希望它通过DSB的所有值来完成DSA的第一个值,然后仅返回这两个数字中的最小值,然后继续重复DSA的所有值。

一种简单的方法是使用dist函数。如果您使用rbind函数组合数据。帧,dist将返回具有成对距离的矩阵。这是我创建的玩具示例。

set.seed(10101)
df1 <- data.frame(x=rnorm(9, 1), y=rnorm(9,-1))
df2 <- data.frame(x=rnorm(10, 1,), y=rnorm(10,1))
distances <- as.matrix(dist(rbind(df1, df2)))

我会在DF1中找到DF2中每个点的最近点。我们只想考虑矩阵的下限,因此我们需要计算适当的行和列索引以搜索。

row.start <- nrow(df1)+1
row.end <- nrow(df1) + nrow(df2)
col.start <- 1
col.end <- nrow(df1)

现在,我们可以使用apply函数在每一行中找到最小的距离。我们可以使用以下代码来完成此操作。

apply(distances[row.start:row.end, col.start:col.end], 1, which.min)

@jrd,对不起,我是新手堆栈溢出的格式问题。我正在为DSA和DSB导入CSV文件(文件为x和y)

DSA
  X Y
1 0 0
2 0 1
3 1 0
DSB
  X Y
1 2 2
2 7 7
df1<-data.frame(DSA[,1:2)
df2<-data.frame(DSB[,1:2)
distances<-as.matrix(dist(rbind(df1,df2)))

距离矩阵给了我这个

> distances
         1        2        3        4        5
1 0.000000 1.000000 1.000000 2.828427 9.899495
2 1.000000 0.000000 1.414214 2.236068 9.219544
3 1.000000 1.414214 0.000000 2.236068 9.219544
4 2.828427 2.236068 2.236068 0.000000 7.071068
5 9.899495 9.219544 9.219544 7.071068 0.000000

从我收集的内容中,这是一个从每个点到彼此的矩阵(甚至在同一数据集中都可以点。我只想从DSA到DSB,看起来应该像

distances
      1        2
1  2.828427 9.899495
2  2.236068 9.219544
3  2.236068 9.219544

不确定如何仅绘制矩阵的这一部分。我使用的其余代码是

row.start<-nrow(df1)+1
row.end<-nrow(df1)+nrow(df2)
col.start<-1
col.end<-nrow(df1)
apply(distances[row.start:row.end, col.start:col.end],1,which.min)

产量4 5和2 2.我的手计算我应该得到DSA行1 = 2.828(DSB = 2,2中的最接点),第2行= 2.236(DSB = 2,2中的最接点)行3 = 2.236(DSB = 2,2的最接近点)最后,它应该产生这样的东西其中d是DSA到最接近DSB点的每个点的最短差异

      X Y D
    1 0 0 2.828
    2 0 1 2.236
    3 1 0 2.236

最新更新