应用 IF 而不是 MATCH 时如何使用 INDEX?
Posted
技术标签:
【中文标题】应用 IF 而不是 MATCH 时如何使用 INDEX?【英文标题】:How to use INDEX when applying an IF and not a MATCH? 【发布时间】:2015-03-27 18:08:21 【问题描述】:我在 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 Old 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 et cetera et cetera,直到找到匹配项。”
有人对如何让它发挥作用有任何建议吗?
我知道旧数据和新数据中对象的坐标是否完全相同,那么我可以只使用 INDEX MATCH 组合,但不幸的是它们确实略有不同。
【问题讨论】:
【参考方案1】:在单元格 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")
【讨论】:
嘿tigeravatar - 快!你比我快了 3 秒……还包括错误检查,我忘了……顺便说一句,我认为这是第一个 哇,是的,完全一样的解决方案,哈哈! @tigeravatar @barryh 您是否根据我的样本数据测试了您的公式?这些方程式似乎对我不起作用。平方根$F2:$F$7
中的术语选择当前正在查看的行中该范围内的任何单元格,即C4-$F$2:$F$7
与C4-F4
相同。 MATCH
是否在$F$2:$F$7
范围内搜索,因为我能想到的唯一错误是没有检查整列,只查看行中的相应单元格。我正在使用 LibreOffice,但这些公式规则在它和 Excel 之间没有区别......
该公式当然可以在 Excel 中使用,它需要“输入数组”-我相信您可以在 Libre Office 中使用此类公式,但我可以很快尝试测试....通过使用 C4-$ F$2:$F$7 你得到一个包含 6 个结果的数组,F2:F7 中的每一行一个,然后 MATCH 找到你的条件为真的第一行
抱歉,我们使用了一种避免数组输入的结构(一个额外的 INDEX 函数),所以您不需要在 excel 中输入数组......但是 Libre Office 在这方面 - 让我检查一下【参考方案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
的第一行从@987654328 列返回所需的ID @
在 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
确认在后一个公式中,您的方程针对F
和G
值的每一行计算C2
和D2
,如果它返回值ROW(F$2:F$200)-ROW(F$2)+1 返回相对行范围内该行的编号(例如,第 2 行是第一行,因此将返回 1,第 30 行是第 29 行,因此将返回 29)。
无论多少行“匹配”SMALL
将只返回其中最小的(SMALL
函数比MIN
更可取,因为如果没有行匹配,MIN
将给出零结果,最好在这里得到在这种情况下会出错)。
INDEX
函数然后从该行返回相应的值
【讨论】:
坚持下去并解决 Libre Office 问题的方法 :) 我想我应该提到我一开始就在使用 LibreOffice。 @barry,你的 excel 公式在 Excel 中适用于我,所以至少我可以在我的家用电脑上完成这部分工作。然而,您的 LibreOffice Calc 公式返回了列E
中的任何值,即它基本上复制了列 B
中的列 E
。我还试图了解该公式是如何工作的,但我不确定我是否遵循:ROW(F$2:F$200)
似乎返回值 2 无论它在列中的哪个位置被评估,并且您的 IF
语句返回值1
如果是真的,1
如果是假的?
听起来你可能没有用 CTRL+SHIFT+ENTER 确认 - 如果你正确地做到了,你会在公式周围得到像 和 这样的“花括号” - 有时我很难做到这一点Libre Office - 我必须进入“插入”选项并勾选“数组公式”框。我将添加到我的答案中以解释该公式的工作原理
嗨,巴里。 CTRL+SHIFT+ENTER 似乎对我没有任何帮助,但您对 Microsoft Excel 的建议效果很好。以上是关于应用 IF 而不是 MATCH 时如何使用 INDEX?的主要内容,如果未能解决你的问题,请参考以下文章
使用“If-None-Match”获取:“etag”标头在 React Native 应用程序中始终返回 200
If-None-Match 有效时 304 Not Modified