我有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的所有值。
答案 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