【问题标题】:How do I search for most similar sequence in Excel?如何在 Excel 中搜索最相似的序列?
【发布时间】:2021-06-03 23:43:15
【问题描述】:

我希望在 Excel 列中搜索与我输入的序列最相似的序列。

例如,在下面的例子中,我提供的序列是:1、2.5、3.5、2.5、1。在下图中用黑色表示。

在我正在搜索的列中,有几个序列。与我最相似的是蓝色。它是:1、2、3、2、1。

Graph

你们中是否有人知道一个 Excel 公式或一系列公式和步骤,它可以让 Excel 确定这一点 - 例如,当我输入黑色序列时,它会将它与蓝色序列匹配为最相似的?

感谢this堆栈溢出的回答,我已经知道如何使用以下公式在一组数字中搜索一个确切的序列:

=MATCH([Criteria 1]&[Criteria 2],[Data 1st val]:[Data last val]&[Data 2nd val]:[Data last + 1 val],0)

例如,如果我有以下数字:1、3、5、1、4,并且我希望找到序列 1、4,那么这个公式将引导我在这组数字中找到它。

我也已经知道如何使用以下公式找到与我输入的数字最接近的匹配项(如果您查看下面的示例图像,这将更有意义):=INDEX($A$1:$A$10,MATCH (MIN(ABS(C1-B1:B10)),ABS(C1-$B$1:$B$10),0))

Example

当我按control+shift+enter时,这个公式会产生数字4,表示第4行,因为我在C1中输入的数字,即39,与位于第4行的数字40最接近.

所以我有两个组成部分——找到确切的序列,找到最接近的数字——但现在的问题是,我如何组合这两个公式来显示最接近的数字序列,如果在我的第一个例子中用蓝线和黑线绘制的图表上看起来最相似的数字?

如果您不仅可以帮助找到最接近的序列,而且可以按最相似到最不相似的顺序找到最接近的序列,则可以加分。

再一次,我不需要将它整合到一个公式中;我很高兴手动完成几个步骤和不同的公式来得出答案。

如果您认为这会以其他方式更好地解决,请告诉我!但我没有任何编码经验,所以我认为 Excel 是我最好的选择。

非常感谢!!!

【问题讨论】:

    标签: arrays excel match sequence closest


    【解决方案1】:

    不确定您是如何设置的,但如果我在表格中可视化您的图表,您可以使用以下内容(如果有 Microsoft365):

    H2中的公式:

    =INDEX(SORTBY(B2:F4,MMULT(ABS(B2:F4-B1:F1),SEQUENCE(5,,,0))),1)
    

    您的所有数据都在一个列中,您可以在下面找到一个示例,说明您是否有 5 个序列。

    C2中的公式:

    =TRANSPOSE(INDEX(SORTBY(INDEX(A2:A16,SEQUENCE(11,5)-ROUNDDOWN(SEQUENCE(11,5,0,0.2),0)*4),MMULT(ABS(INDEX(A2:A16,SEQUENCE(11,5)-ROUNDDOWN(SEQUENCE(11,5,0,0.2),0)*4)-TRANSPOSE(B2:B6)),SEQUENCE(5,,,0))),1))
    

    如果您想让这适用于来自A1:A500 的数据集,包含 10 个数字序列:

    =TRANSPOSE(INDEX(SORTBY(INDEX(A1:A500,SEQUENCE(COUNT(A1:A500)-9,10)-ROUNDDOWN(SEQUENCE(COUNT(A1:A500)-9,10,0,0.1),0)*9),MMULT(ABS(INDEX(A1:A500,SEQUENCE(COUNT(A1:A500)-9,10)-ROUNDDOWN(SEQUENCE(COUNT(A1:A500)-9,10,0,0.1),0)*9)-TRANSPOSE(B1:B10)),SEQUENCE(10,,,0))),1))
    

    如果您可以访问LET() 会更好,并且只需更改范围参考即可:

    =LET(X,A2:A500,Y,INDEX(X,SEQUENCE(COUNT(X)-9,10)-ROUNDDOWN(SEQUENCE(COUNT(X)-9,10,0,0.1),0)*9),TRANSPOSE(INDEX(SORTBY(Y,MMULT(ABS(Y-TRANSPOSE(B2:B11)),SEQUENCE(10,,,0))),1)))
    

    EDIT2:

    为了使其更具动态性,您可以使用:

    =LET(W,1,X,A2:A500,Y,11,Z,INDEX(X,SEQUENCE(COUNT(X)-(Y-1),Y)-ROUNDDOWN(SEQUENCE(COUNT(X)-(Y-1),Y,0,1/Y),0)*(Y-1)),TRANSPOSE(INDEX(SORTBY(Z,MMULT(ABS(Z-TRANSPOSE(B2:INDEX(B:B,Y+1))),SEQUENCE(Y,,,0))),W)))
    

    其中“W”是第 n 个最接近的匹配,其中“Y”是序列的长度,在示例中为 11。

    【讨论】:

    • 嗨,JvdV,你是个天才!这是我第一次使用 Stack Overflow,感觉好得令人难以置信。谢谢,这让我离目标更近了!但是,还有一个问题我希望得到您的帮助:在这种情况下,存在三个独立的序列(橙色、蓝色和灰色)。但是,就我而言,只有一长列数字,例如 A1:A500。在这组数字中,大约有 500 个 10 数字序列: A1:A10 、 A2:A11 、 A3:A12 等等。有什么方法可以将您的 MMULT 公式应用于一列中的这些序列?
    • 也许明智的做法是首先使用=INDEX(A$2:A$500,SEQUENCE(1,10,ROW(A1))) 写出所有可能的十个序列。将其向下拖动直到最后一个序列,然后使用上述解决方案。
    • 嗨,JvdV,这太棒了,正是我想要的。我在 LET () 公式上取得了巨大的成功,直到第 10 位。但是——我很抱歉一直在问问题——当我试图走得更高时,它会显示 #ref。如果我想查找长度为 30 或 45 个数字的序列,您介意解释我应该如何将它们输入到公式中吗?这就是我 11 所拥有的,它不起作用。 =LET(X,A1:A15000,Y,INDEX(X,SEQUENCE(COUNT(X)-10,11)-ROUNDDOWN(SEQUENCE(COUNT(X)-10,11,0,0.1),0)*9) ,TRANSPOSE(INDEX(SORTBY(Y,MMULT(ABS(Y-TRANSPOSE(B1:B11)),SEQUENCE(11,,,0))),1))) --谢谢!!!!!!跨度>
    • 哦,还有一件小事——然后我保证,我已经完成了,因为你已经超越了——你知道一种让它不仅提供最接近的匹配,但也是第二接近、第三接近等?到目前为止,我已经能够通过简单地从一组数字中删除最接近的匹配项来找到它们,然后它会自动转到下一个最佳选项,但必须有更好的方法。非常感谢你所做的一切——你既善良又非常聪明
    • 美丽。正是我想要的。你怎么知道这一切??不管怎样,非常感谢你——这对我的生活产生了巨大的影响
    【解决方案2】:

    我的方法是计算每种颜色和输入值之间的匹配值,例如每个点的差异之和。

    这个公式是:

    =SUM(IF([inputrange]<>"",ABS([inputrange]-[colorrange]),0))
    

    其中 [inputrange] 是您输入的范围(在下图中用红色表示,$C$6:$G$6),[colorrange] 是该颜色的范围(用蓝色表示,C2:G2)。

    差异最小的颜色为匹配:

    =VLOOKUP(MIN([matchvalues],[rangeofmatchandcolors],2,0)
    

    其中 [matchvalues] 是匹配值的范围(下图中用蓝色表示,单元格 A2:A4),[rangeofmatchandcolors] 是匹配值和颜色(用红色表示,A2:B4)

    【讨论】:

    • 您好 Jan,非常感谢您回答我的问题。这看起来真的很有趣,我最喜欢的功能是旁边的匹配值数字,因为它不仅可以让我轻松找到最接近的匹配,还可以轻松找到第二接近、第三接近等。然而,不幸的是,我发现自己太笨了,无法弄清楚如何输入公式。我不确定你的意思是什么,“其中 [inputrange] 是输入的点值(黑色),而 [colorrange] 是该颜色的范围。”您能否举一个为其中一种颜色填写公式的示例?谢谢!!!
    • 我已经用更多细节更新了答案。图片对应上面输入的公式
    • 啊,这帮了很大的忙——显然,我是一个初学者,我希望这不会太令人沮丧。但是由于您的详细说明,我现在已经启动并运行它。然而,现在我必须告诉你一个丑陋的事实:我的数据不是单独的序列,例如灰色、蓝色和橙色。实际上,它只是在一长列数字中,例如 A1:A500。在这组数字中,大约有 500 个 10 数字序列: A1:A10 、 A2:A11 、 A3:A12 等等。有什么方法可以将您的绝妙公式应用于一列中的这些序列?
    • 不仅要提取最接近的序列(上面的用户已经弄清楚了),还要为每个序列提供匹配值?这样,我可以将匹配值从小到大排序,这样我就可以看到最相似的序列、第二相似的序列、第三相似的序列等。非常感谢您抽出宝贵的时间!你真的很棒。
    • 它可以是相同的公式,仅适用于不同的范围集。只要每个范围内的单元格数量(我的示例中 [ ] 之间的部分)相同,就可以了。在您的示例中,一种颜色有 5 个数据点,这就是我使用 C 到 G 列的原因。例如,您可以将匹配值公式放在每个数字旁边。如果您将每个数字都视为序列的开始,那么您实际上是从该等式中删除了颜色名称。最低匹配值向您显示最佳匹配的起点(第一个数字)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2017-08-05
    相关资源
    最近更新 更多