为简单起见,如果我有一个点矢量看起来像:
x = c(1,4,5,8,9)
我正试图找到彼此等距的n
点。在这种情况下我的n=3
所以我的理想答案是:
1,5,9-
自5-1=4
和9-5=4
。
实际向量和n
更大/更复杂。
关于如何实现这一目标的任何想法?
提前致谢!
答案 0 :(得分:1)
与上面的评论一致,这可能是你想要的东西,不一定是你要求的东西。不过,我确信有更有效的方法可以做到这一点。
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
答案 1 :(得分:1)
这不是整个解决方案,但我认为这是一个解决方案的开始。首先,计算距离矩阵可能会有所帮助。
> 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
函数标识的所有点组处理为超出您选择的大小,然后检查连接性。