【问题标题】:Excel: return the row number of nearest match to two valuesExcel:将最近匹配的行号返回为两个值
【发布时间】:2019-02-19 10:48:04
【问题描述】:

我有两个需要匹配坐标的列表。

一个非常大的列表(434,561 行)结构如下(在 Excel 中将列视为 A、B 和 C):

code (ID) |  Latitude  |  Longitude
----------|------------|-----------
point455  |  4.513523  |  23.754457
point478  |  74.123523 |  83.757459
[...]

另一组具有相同结构的点的第二个列表(4000 行)。

我想将第二个列表中的每个点与第一个列表中最接近的坐标相匹配。差不多是这样的:

(second list)
code (ID) |  Latitude  |  Longitude  |  Closest point
----------|------------|-------------|--------------
tag165    |  4.513523  |  23.754457  |  point488
tag198    |  74.123523 |  83.757459  |  point124
[...]

我尝试分别匹配纬度和经度。下面的公式给出了单元格中包含最近长值的值:

=INDEX(ALLStops!B2:ALLStops!$B$434561, MATCH(MIN(ABS(ALLStops!$B$2:ALLStops!$B$434561-B2)), ABS(ALLStops!B2:ALLStops!$B$434561-B2), 0))

两列具有相同的公式,并且被独立处理。然后我使用=MATCH(E2,ALLStops!B2:B434561,0) 获取行。

但是大约 1/3 的条目具有最近坐标在不同行上的值,这显然是无用的。

所以匹配为最接近的两个坐标值需要在同一行,我猜计算必须压缩为一个。

任何人都可以提出一种限制这种情况的方法,或者一种更简洁(并且内存占用更少)的方法吗?

【问题讨论】:

  • 我会用勾股定理来确定两点之间的差异:假设你有你的target 和你所有的stops。从您的每个stop 纬度中减去target 的纬度(我们称该变量为dLat)。然后对你的经度做同样的事情(再说一遍dLon)。然后,这些值的平方的平方根将是这两个点之间的坐标差:=SQRT(dLon^2 + dLat^2)
  • 请注意,如果您使用地球表面上的坐标,距离将不会按比例表示:两个经度之间的距离在赤道处最长,并且随着您的移动越来越小两极

标签: arrays indexing excel-formula match vlookup


【解决方案1】:

编辑:根据您的评论,这是修改后的公式。

假设较长的列表在 A、B 和 C 列中可用,而较短的列表在 F 到 I 中可用,您可以使用此公式从大列表中获取与候选列表中的点最接近的匹配代码。

=INDEX(A$2:A$434562,SUMPRODUCT((MIN(SQRT(($B$2:$B$434562-G2)^2+($C$2:$C$434562-H2)^2))=SQRT(($B$2:$B$434562-G2)^2+($C$2:$C$434562-H2)^2))*ROW($A$1:$A$434561)))

...使用 Ctrl+Shift+Enter 执行。希望这会有所帮助

【讨论】:

  • 感谢 Faseeh,这可行,但它给出了短列表中的行号。我需要相反的。我需要长列表中的行号,其中包含与短列表中的值最接近的值对。因为我需要长列表中的代码。
  • 我已经调整了公式,看看是否有效。
  • 如果您将其放入 IF 语句中,则此重新排列有效:{=IF(SHORT!B2="","",SUMPRODUCT((MIN(SQRT((LONG!$B$2: $B$434561-(短!B2))^2+(长!$C$2:$C$434561-(短!C2))^2))=SQRT((长!$B$2:$B$434561-(短) !B2))^2+(LONG!$C$2:$C$434561-(SHORT!C2))^2))*(ROW($B$2:$B$434561))))} 非常感谢您的帮助。
  • 我得到了几个奇怪的异常值,它们在搜索数组之外。知道为什么会发生这种情况吗?第 56 行结果 = 842,240 第 58 行结果 = 842,208
  • 我认为有不止一个匹配,并且 sumproduct 是对行数求和。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多