为简单起见,如果我有一个看起来像这样的点向量:
x = c(1,4,5,8,9)
我试图找到n
彼此等距的点。在这种情况下n=3
,我的理想答案是:
1,5,9
由于5-1=4
和9-5=4
。
实际的向量要大得多/复杂得多n
。关于如何实现这一目标的任何想法?
提前致谢!
与上述评论一致,这可能是您想要的,不一定是您要求的。不过,我确信有一种更有效的方法可以做到这一点。
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 8
这不是整个解决方案,但我认为这是一个开始。首先,计算距离矩阵可能会有所帮助。
> 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
距离矩阵中的 s:这些是x
. 但是您仍然需要做更多的工作才能消除第 2 点和第 4 点。想必你选择第 1、3、5 个点是因为它们是相连的?
我认为您会希望将rle
函数标识的所有点组处理为超过您选择的大小,然后检查连接性。