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()
版本=]函数。
最近我回答了一个问题,关于如何在 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()
构造感兴趣,您可能会喜欢 LAMBDA()
版本=]函数。