【问题标题】:Comparing two arrays - Horizontal vs Vertical比较两个数组 - 水平与垂直
【发布时间】:2020-03-11 21:35:37
【问题描述】:

这是什么情况

我正在尝试比较两个数组。为简单起见,假设我们想知道一个数组的值在另一个数组中存在的频率。

我的引用/查找数组数据位于A1:A3

Apple
Lemon
Pear

我的搜索数组不在工作表中,而是写在{"Apple","Pear"}

问题

所以要知道我们的搜索值在查找数组中出现的频率,我们可以应用如下公式:

{=SUMPRODUCT(--(range1=range2))}

但是,{=SUMPRODUCT(--({"Apple","Pear"}=A1:A3))} 会产生错误。换句话说,查找数组没有按预期工作。

起作用的是使用TRANSPOSE() 函数首先使用{=SUMPRODUCT(--({"Apple","Pear"}=TRANSPOSE(A1:A3)))} 从我的数据创建一个水平数组,从而得到正确答案2!

似乎我的类型化数组被自动处理为水平数组,而我的数据显然最初是垂直的。

为了检验我的假设,我尝试了另一个公式:

{=SUMPRODUCT(--({"Apple","Pear"}={"Apple","Lemon","Pear"}))}

两者都是类型化数组,因此按照上述逻辑,它都是水平数组,完全可以在不使用TRANSPOSE() 的情况下工作,但是这会返回错误! #N/A

再次{=SUMPRODUCT(--({"Apple","Pear"}=TRANSPOSE({"Apple","Lemon","Pear"})))} 给出了正确答案 2。

问题

谁能给我解释一下:

  • 水平数组无法与垂直数组进行比较的原因。
  • 为什么类型化的数组会自动作为水平处理
  • 为什么在我的假设测试中,第二个类型的数组被处理为垂直的。

我真的很好奇,也很乐意链接到适当的文档,因为到目前为止我还没有找到任何文档。

这可能是一个容易回答的问题,尽管我似乎无法理解其中的逻辑。

【问题讨论】:

  • 只是说,这是一个垂直数组:{"Apple";"Lemon";"Pear"}(注意分隔符的区别)
  • 谢谢@Jerry,我的系统分隔符是分号,因为我使用的是荷兰语应用程序。这会导致我的问题吗?另外,{=SUMPRODUCT(--({"Apple","Pear"}={"Apple","Lemon","Pear"}))} 不应该是相等的类型或数组吗?有没有想过为什么那行不通?
  • 我一直试图为此找到一个合适的术语,但我一直没能找到。我不确定您的问题是否是this recent answer of mine 的直接子序列,但我发现的最接近的问题似乎是Outer Product Matrix Multiplication。我个人必须通过反复试验和尝试来了解它是如何工作的,所以我无法真正完整详细地解释它是如何工作的,也不知道它为什么会这样工作。
  • 关于分隔符,也许是的。在英文版中,逗号用来分隔列,分号用来分隔行,所以{1,2;3,4;5,6}是一个3行2列的矩阵。也许荷兰语版本中的分隔符被切换了?
  • 是的,所以当我这样做时,我得到this 作为结果[通过按以下顺序比较获得结果:apple=apple,apple=lemon,apple=pear; pear=apple, pear=lemon, pear=pear], (最后变成 2,我认为从图片中应该很明显)。似乎管道| 分隔了列,虽然它看起来很奇怪,哈哈

标签: excel excel-formula


【解决方案1】:

谁能给我解释一下:

  • 水平数组无法与垂直数组进行比较的原因。

这其实是可以的,你也可以将水平数组和其他水平数组进行比较。

您收到错误的原因是数组长度不匹配。考虑以下数组:

执行=SUMPRODUCT(--(B3:D3=F3:G3))=SUMPRODUCT(--({"Apple","Lemon","Pear"}={"Apple","Pear"})) 相同(在excel 的英文版本上,我不能100% 确定其他版本的分隔符)并导致=SUMPRODUCT(--(Apple=Apple, Lemon=Pear, Pear=???)),即第一个数组的第n 个元素与第二个数组的第 n 个元素进行比较,如果没有匹配项——第一个数组中的第三个元素是 Pear,但第二个数组没有第三个元素——那么你会得到 N/A

当您比较两个数组时,一个垂直的,一个水平的,excel 实际上“扩展”了最终的数组。考虑以下情况(1row x 3col 和 2row x 1col):

执行=SUMPRODUCT(--(B3:D3=F3:F4))=SUMPRODUCT(--({"Apple","Lemon","Pear"}={"Apple";"Pear"})) 相同,结果为=SUMPRODUCT(--(Apple=Apple, Lemon=Apple, Pear=Apple; Apple=Pear, Lemon=Pear, Pear=Pear))。基本上感觉就像 Excel 扩展了这样的两个数组(3col x 2row):

这种“扩展”只发生在一个数组高 1 行而另一个数组宽 1 列时,我相信,所以如果您采用具有不同内容的数组,那么 excel 将返回尝试将元素与“无”进行比较' 给出 N/A(您可以使用“公式”选项卡下的“评估公式”功能来提供帮助):

所以本质上 excel 得到的东西有点类似于这个,第一个数组乘以第二个数组,得到结果数组:

但由于最后一行和最后一列涉及空白,因此您在此处得到 N/A。

  • 为什么类型化的数组会自动作为水平处理

在您的问题中,似乎, 分隔行,因此使用=SUMPRODUCT(--({"Apple","Pear"}=A1:A3)),您观察到类似于我第一个示例中两行的比较,而使用=SUMPRODUCT(--({"Apple","Pear"}=TRANSPOSE(A1:A3))),您将获得“扩展”发生。

如 cmets 中所述,在英文版的 excel 中,, 分隔列,; 分隔行,这可以在这个简单的示例中观察到,我提供了一个 2 行和 3 列的数组,excel 显示{0,0,0;0,0,0}:

  • 为什么在我的假设测试中,第二个类型的数组被处理为垂直的。

TRANSPOSE 只需将数组从垂直切换到水平(反之亦然),但根据我的回答的第一部分,您会得到不同的结果,因此您要么N/A 当 excel 无法将一个数组的一项与另一个数组的另一项匹配时,或者两个数组的“扩展”导致更大的数组。

【讨论】:

  • 感谢您的清晰解释。看起来,不同大小的数组必须水平与垂直进行比较,TRANSPOSE 函数可以更改为对列和行使用适当的分隔符。我现在看到我的逻辑哪里出了问题,但是有一件事仍然困扰着我。根据 cmets,我的列分隔符似乎应该是 |,但是在工作公式中用这个管道符号替换 , 不会让我的公式起作用。看来我不得不求助于TRANSPOSE()
  • @JvdV 是的,不幸的是,我不知道如何使这项工作发挥作用,因为我只有英文版的 excel。不过我会努力寻找的。​​span>
  • 只有当你能交配时,它已经非常有帮助了。供您参考:{=SOMPRODUCT(--({"Apple"|"Pear"}={"Apple";"Lemon";"Pear"}))} 不能作为公式输入,Excel 需要我替换管道符号。然而,根据 cmets 的屏幕截图显示这是适当的符号。
  • @JvdV 好的,我可以通过在控制面板中更改我的区域设置来将我的 excel 更改为荷兰语 ^^ 并且...it's actually a backslash to delimit columns 经过几次尝试!
  • 是的!评估时倾斜的反斜杠,Excel 是多么的鬼鬼祟祟!感谢您解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
相关资源
最近更新 更多