Excel - 没有助手的按行计算

Excel - Row-wise calculation without helpers

最近我回答了一个问题,关于如何在 2 列矩阵 没有助手 的情况下检索每个 MEDIAN()MEDIAN(),例如:

没有助手的逐行计算并不太难,因为只有两个值的中位数始终是平均值。因此,只需一个简单的公式即可:

=MEDIAN((A1:A3+B1:B3)/2)

但是出于好奇,我是否至少要有一个 3 列矩阵?

实际上需要计算中位数。这里的中位数是 {8,2,2}.

我似乎找不到一种方法来对 3+ 列进行逐行计算。在这种情况下,它是关于 MEDIAN() 但我可以想象可能还有其他功能。因为这可能是简化的数据,所以我不想求助于 =MEDIAN(MEDIAN(A1:C1),MEDIAN(......

我尝试 fiddle 使用 OFFSET(),虽然我不喜欢 volatile 函数我希望它可以直接使用数组,或者通过使用 [=18 正确触发=].然后我继续使用 MMULT()LARGE() 的组合,但是 none 我的尝试是成功的。

问题

所以问题最终是;我们如何 return 在没有助手的情况下按行计算的结果(数组)。如果不可能,那也是一个很好的答案,这样我就可以休息了 =)

新答案

使用新的 BYROW() 函数可以使用:

=MEDIAN(BYROW(A1:C3,LAMBDA(a,MEDIAN(a))))

第二个参数中的嵌套 LAMBDA() 使得循环动态数组(本身不是范围)中的所有行变得轻而易举。


上一个答案(预 BYROW())

所以。经过长时间的思考,据我所知,通过当前的公式这是不可能的。但是,目前处于 BETA 阶段,Excel365 将具有新的 LAMBDA() 函数,这使得您可以在没有 VBA 的情况下创建自己的函数,甚至可以递归调用自身。这不是最漂亮的解决方案,但我想我会在这里分享我所做的事情:

E3中的公式:

=MED(A1:C3,"",ROWS(A1:A3))

其中 MED() 是我们在“名称管理器”菜单中创建的 LAMBDA() 函数。上面写着:

 =LAMBDA(rng,txt,rws,IF(rws=0,MEDIAN(FILTERXML("<t><s>"&txt&"</s></t>","//s")),MED(rng,TEXTJOIN("</s><s>",,txt,MEDIAN(INDEX(rng,rws;0))),rws-1)))

可以看出有4个主要参数,其中3个变量:

  • rng - 要检查的范围。
  • txt - 在 FILTERXML().
  • 中使用的保留变量
  • rws - 计数器。

第 4 个参数是嵌套的 IF(),如果计数器为 0,则将 return 所有中位数的中位数。这是通过 FILTERXML() 完成的,我现在不会详细介绍。

如果计数器尚未为 0,它将递归调用 LAMBDA() 函数直到为 0,它所做的是使用相同的三个参数,但我们可以立即更改它们。因此我们保持 rng 不变,我们通过 TEXTJOIN() 连接行(当前计数器)的 MEDIAN() 以创建有效的 xml 构造。最后但同样重要的是,我们需要降低计数器。

这很困难,但是 LAMBDA() 现在可以进行按行计算了。

请注意,如果您对 FILTERXML() 构造感兴趣,您可能会喜欢 post 我现在还包含了 [=32] 的 LAMBDA() 版本=]函数。