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

时间:2016-06-28 17:57:29

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

我有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值?

目前,DSA中的第一个点仅由DSB中的第一个点完成,然后DSA的第二个值仅由DSB的第二个值完成。我希望它按DSB的所有值执行DSA的第一个值,然后只返回这两个数中最小的一个并继续重复DSA的所有值。

2 个答案:

答案 0 :(得分:0)

一种简单的方法是使用$temp = array(); foreach($html->find('a') as $element) { $temp[] = $element->href; } echo '<pre>' . print_r(array_unique($temp), true) . '</pre>'; 功能。如果使用dist函数组合data.frames,rbind将返回具有成对距离的矩阵。这是我创建的玩具示例。

dist

我会在df1中找到df1中每个点的最近点。我们只想考虑矩阵的下部块,因此我们需要计算正确的行和列索引来搜索。

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)))

我们现在可以使用row.start <- nrow(df1)+1 row.end <- nrow(df1) + nrow(df2) col.start <- 1 col.end <- nrow(df1) 函数来查找每行中的最小距离。我们可以使用以下代码行完成该任务。

apply

答案 1 :(得分:0)

@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