为了简单起见,如果我有一个点的向量,如下所示:
x = c(1,4,5,8,9)我试着找出彼此距离相等的n点。在本例中是我的n=3,所以我的理想答案是:
1,5,9
从5-1=4和9-5=4开始。
实际的向量要比n大得多/复杂得多。关于如何实现这一点有什么想法吗?
提前感谢!
发布于 2013-06-19 20:40:18
这不是解决方案的全部,但我认为这是一个解决方案的开始。首先,计算距离矩阵可能会有所帮助。
> x <- c(1,4,5,8,9)
> dx <- dist(x)
> dx
1 2 3 4
2 3
3 4 1
4 7 4 3
5 8 5 4 1其次,您可以通过对距离进行排序并对其进行游程编码来识别相距相同的点。
> rdx <- rle(sort(dx))
> rdx
Run Length Encoding
lengths: int [1:6] 2 2 3 1 1 1
values : num [1:6] 1 3 4 5 7 8您可以选择所需的点集,然后使用order函数返回到原始距离矩阵中的索引。以第三组--距离为4的点--为例
> i=3
> orderedIndex <- sum(rdx$lengths[1:(i-1)])
> order(dx)[(orderedIndex+1):(orderedIndex+rdx$lengths[i])]
[1] 2 6 9(索引从上到下计数,然后从左到右计数)。在这里,您已经在距离矩阵中标识了4:这些是x中的第1/3、第2/4和第3/5点之间的距离。但是你仍然需要做更多的工作来消除第二个和第四个点。想必你选择第一、第三和第五点是因为它们是相连的吧?
我认为您可能希望将rle函数标识的所有点处理为超出您选择的大小,然后检查连接性。
发布于 2013-06-19 18:32:13
与上面的评论一致,这里的一些东西可能是你想要的,而不一定是你所要求的。不过,我相信有一种更有效的方法可以做到这一点。
x = c(1,4,5,8,9)
x2 <- as.matrix(expand.grid(x, x))
x2 <- as.data.frame(t(apply(x2, 1, sort)))
x2 <- x2[!duplicated(x2), ]
x2 <- cbind(x2, d =abs(mapply("-", x2[,1], x2[,2])))
x2[order(x2$d), ]
# V1 V2 d
# 1 1 1 0
# 7 4 4 0
# 13 5 5 0
# 19 8 8 0
# 25 9 9 0
# 8 4 5 1
# 20 8 9 1
# 2 1 4 3
# 14 5 8 3
# 3 1 5 4
# 9 4 8 4
# 15 5 9 4
# 10 4 9 5
# 4 1 8 7
# 5 1 9 8https://stackoverflow.com/questions/17179047
复制相似问题