我已经找到了答案,但我认为我的问题可能有点过于具体。
我在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&#34;对于单元格F2和G2中的这些X和Y值,请检查C2和D2中的值。如果d是&lt; 1然后打印E2。如果没有,请检查F3和G3并打印E3,如果它是真的等等等,直到找到匹配为止。&#34; 有没有人对如何使这个工作有任何建议?
我试图尽可能清楚地解释我想要做的事情。如果这令人困惑,我很抱歉。我知道如果旧数据和新数据中的对象的坐标完全相同,那么我可以使用INDEX MATCH组合但不幸的是它们确实略有不同。
答案 0 :(得分:4)
在单元格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")
答案 1 :(得分:2)
在Excel中,这个公式适用于我
=INDEX(E$2:E$200,MATCH(TRUE,INDEX(SQRT((C2-F$2:F$200)^2+(D2-G$2:G$200)^2)<1,0),0))
这会将您的公式应用于F/G
与C2
和D2
进行比较的每一对,而MATCH
- <1
会找到该值为INDEX
的第一行和{ {1}}会从列E
在Libre Office中,我无法使MATCH
函数与数组一起工作,但此版本按要求执行:
=INDEX(E$2:E$200,SMALL(IF(SQRT((C2-F$2:F$200)^2+(D2-G$2:G$200)^2)<1,ROW(F$2:F$200)-ROW(F$2)+1),1))
使用 CTRL + SHIFT + ENTER确认
在后一个公式中,如果C2
和D2
值为F
和G
,则会针对ROW(F$2:F$200)-ROW(F$2)+1
和SMALL
计算等式,如果它返回值< 1然后SMALL
,返回该范围内该行的相对行号(例如,第2行是第一行,因此返回1,第30行是第29行,因此返回29)。
然而,许多行“匹配”MIN
只会返回最小的行(MIN
函数优于INDEX
,因为{{1}}如果没有则会给出零结果行匹配,在这种情况下更好地获得错误)。
{{1}}函数然后返回该行的相应值