【问题标题】:Nearest Neighbor (distance between coordinate pairs)最近邻(坐标对之间的距离)
【发布时间】:2016-10-31 04:34:12
【问题描述】:

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

示例 DSA = 0,0 0,1 1,0 DSB 设置 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 值?

就目前而言,它将仅对 DSB 中的第一个点执行 DSA 中的第一个点,然后仅对 DSB 中的第二个值执行 DSA 的第二个值。我希望它通过 DSB 的所有值来做 DSA 的第一个值,然后只返回这两个数字中最小的一个,并不断重复所有 DSA 的值。

【问题讨论】:

    标签: r coordinates distance nearest-neighbor euclidean-distance


    【解决方案1】:

    一个简单的方法是使用dist 函数。如果您使用 rbind 函数组合 data.frames,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 = 0,0 0,1 1,0 DSB = 2,2 7,7 'df1 row.end col.start col.end 应用(距离 [row.start:row.end, col.start:col.end],1,which.min) 4 5 '
    • 产量 4 5 和 2 2. 我的手算我应该得到 DSA 第 1 行 = 2.828(DSB 中的最近点 = 2,2),第 2 行 = 2.236(DSB 中的最近点 = 2,2 ) 第 3 行 = 2.236(DSB 中的最近点 = 2,2)。任何建议
    • @StevenL 我不确定您是否正确创建了 data.frames。看起来他们可能只有一列?您能否格式化代码以便我可以复制并运行它?
    【解决方案2】:

    @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
    

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 2020-01-26
      • 2022-06-16
      • 1970-01-01
      • 2018-06-16
      • 2021-10-11
      • 1970-01-01
      • 2011-06-18
      • 2012-11-20
      相关资源
      最近更新 更多