应用 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$7C4-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)&lt;1,0),0))

这会将您的等式应用于F/G 中的每一对,与C2D2 进行比较 - MATCH 找到该值为&lt;1INDEX 的第一行从@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)&lt;1,ROW(F$2:F$200)-ROW(F$2)+1),1))

CTRL+SHIFT+ENTER

确认

在后一个公式中,您的方程针对FG 值的每一行计算C2D2,如果它返回值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

如何理解js中的match

使用“SCNView”而不是“ARSCNView” - 不支持时

浏览器未发送 If-None-Match 标头

如何在 package.json 中选择“模块”而不是“主”文件