我在 LibreOffice Calc 中有两个数据集,其中包含平面中对象的笛卡尔坐标。一种是具有 X 个对象的旧数据,另一种是具有相同 X 个对象 + N 个新对象的较新数据。
Excel 电子表格:
A B C D || E F G
| | | | || | | |
1 - New ID Previous ID X Value Y Value || Old ID X Value Y Value
2 - 1a ? 89.09 73.79 || 1a 52.60 94.15
3 - 1b ? 52.50 94.05 || 1b 81.20 28.49
4 - 1c ? 36.72 94.85 || 2a 91.04 38.93
5 - 2a ? 81.14 28.38 || 3a 68.65 84.64
6 - 2b ? 07.50 46.69 || 3b 64.50 37.18
7 - 3a ? 90.72 39.00 || 4a 18.36 03.65
对于每个旧对象的坐标(F 和 G 列),我想遍历所有新对象的坐标(C 和 D 列),看看两者之间的距离 d 是否很远小(对我来说,小于 1
的值就足够了)。
d = SQRT( (X2-X1)^2 + (Y2-Y1)^2 )
如果 d < 1 那么这意味着它们是同一个对象,我想在 B 列中记录它的旧 ID
。
=IF(SQRT((C2-$F$2)^2+(D2-$G$2)^2)<1,$E$2,0)
当我单击并拖动直到出现一个 ID 时,上述公式一次适用于一个对象;但是,我必须复制和粘贴很多东西才能继续使用这种方法。问题是我有大约 260 个新对象要搜索大约 180 个旧对象。手动点击和拖动太费力了。
我还没有想出一种方法来使用 VLOOKUP 或 INDEX 告诉 Excel“对于单元格 F2 和 G2 中的这些 X 和 Y 值,去检查 C2 和 D2 中的值。如果 d < 1然后打印 E2。如果不是,请检查 F3 和 G3,如果是,则打印 E3 等等等等,直到找到匹配项。”
有人对如何让它发挥作用有任何建议吗?
我知道如果旧数据和新数据中的对象的坐标完全相同,那么我可以只使用 INDEX MATCH 组合,但不幸的是它们确实略有不同。
最佳答案
在单元格 B2 中向下复制,您将需要这两个公式之一。我对您要找的东西有点模糊,但我相信其中一个适合:
=IFERROR(INDEX($E$2:$E$7,MATCH(TRUE,INDEX(SQRT((C2-$F$2:$F$7)^2+(D2-$G$2:$G$7)^2)<1,),0)),"No Match")
或者:
=IFERROR(INDEX($E$2:$E$7,MATCH(TRUE,INDEX(SQRT(($C$2:$C$7-F2)^2+($D$2:$D$7-G2)^2)<1,),0)),"No match")
关于indexing - 应用 IF 而不是 MATCH 时如何使用 INDEX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28199077/