【发布时间】:2018-08-11 09:44:40
【问题描述】:
我想在 R 中执行以下操作:对于向量 X 中的每个元素,我想要向量 Y 中的最近邻,这样每个 X-Y 匹配之间的绝对差之和最小化。向量 Y 至少和向量 X 一样长。
问题是:我想在不替换的情况下执行此操作。例如,给定:
X= c(3, 6)
Y= c(1, 2, 4, 10),
我想获得Z= c(2, 4),因为匹配 3 到 2 和 6 到 4 比匹配 3 到 4 和 6 到 10 创建的总距离更小。
*这是我的第一个堆栈问题,因此对于我在提问时所犯的任何错误,请提前道歉。
更新:为了使用@merv 更具说明性的示例和术语,我正在寻找匹配的全局最优值,而不是局部最优值(第一个/贪婪匹配)。例如,如果X= c(3,7) 和Y= c(1,4,12),我想获得Z= c(1, 4),它的曼哈顿距离为5。我不想要第一个/贪婪匹配,这将是Z= c(4, 12)——这将获得通过找到最接近 3 的匹配项,然后找到最接近 7 的匹配项。
【问题讨论】:
-
试试
Y[findInterval(X, Y)] -
@akrun 解决方案很好,但你也可以:
Y[sapply(X, function(x) which.min(abs(Y - x)))] -
谢谢你们;然而,虽然这些建议适用于我给出的具体示例,但它们不适用于以下情况:
X= c(10, 12)和Y= c(1, 11, 14)。 @akrun 的建议给了c(1, 11),而@PoGibas 的建议给了c(11, 11)。答案应该是c(11, 14),因为 10 应该匹配 11,而 12 应该匹配 14。 -
为什么
12匹配14,而不匹配11? -
更新了问题以解决@merv 的查询
标签: r nearest-neighbor