为什么这个Excel公式有效?
在这个答案中给出了下面的公式。
{=PERCENTILE(IF(COLUMN(INDIRECT("1:"&MAX(Data!N3:N15)))<=Data!N3:N15,Data!M3:M15,""),0.25)}
它应该用权重来计算第一个四分位数据。
我一直在试图理解这个公式说什么,但我不能。
首先,大括号是什么? (可能是一个愚蠢的问题。)
其次,在给定两个数据范围作为操作数时, <=
操作符是做什么的?
第三,如果不pipeif语句中的条件如何,返回的数据只是值列,这怎么可能给出正确的答案呢? 在我看来,这个公式是做什么的
- 如果奇怪的条件满足,则计算值列的第一个四分位数。
- 如果不是,则计算“”的第一个四分位数。
这似乎是完全错误的…
另外,我在哪里可以findExcel函数和操作符的完整手册? 在线帮助文件没有说明比较两个范围。
就我个人而言,我不会使用引用的公式 – 我怀疑它是否完全符合作者的想法,在某些情况下会得到不正确的结果。 你可以看到这个部分的问题
=COLUMN(INDIRECT("1:"&MAX(Data!N3:N15))
如果MAX(Data!N3:N15)
是2或200,则返回完全相同的结果。如果MAX(Data!N3:N15)
= 2,
=COLUMN(INDIRECT("1:2"))
我假设作者的意图是返回一个数组像{1,2} …….但它不这样做。 INDIRECT(“1:2”)给你1:2,它被解释为整个行1和2,所以= COLUMN(1:2)给你所有列的数字(1到256或1到16384取决于您使用的是哪个版本的Excel,或者您是否使用兼容模式)。
你可以在单元格中使用这个公式来testing
=COUNT(COLUMN(INDIRECT("1:"&MAX(Data!N3:N15))))
用CTRL+SHIFT+ENTER
你要么得到256或16384,但是这不取决于列N中的值。
该公式可能会给你正确的结果,但如果Data!N3:N15中的任何值> 256(或16384取决于版本),则该公式可能无法正常工作。
在所有情况下,这个版本的公式应该按照预期进行:
=PERCENTILE(IF(TRANSPOSE(ROW(INDIRECT("1:"&MAX(Data!N3:N15)))) <=Data!N3:N15,Data!M3:M15,""),0.25)
…..但解释它如何工作让我们看看只有4行,即减less版本
=PERCENTILE(IF(TRANSPOSE(ROW(INDIRECT("1:"&MAX(Data!N3:N6))))<=Data!N3:N6,Data!M3:M6,""),0.25)
并假设M3:M6包含这些值 – 10,75,15,23,并且N3:N6包含这些值1,2,3,4,
现在MAX(Data!N3:N6)
= 4,所以INDIRECT
给你“1:4”,并传递给ROW函数,所以你得到一个数组{1; 2; 3; 4} [这是一个“列”的值],但TRANSPOSE
将其转换为{1,2,3,4} [这是值的“行”) – 转换的原因是因为当一列与一行进行比较时,反之亦然, 在一个数组中,每个数值都在另一个数组中 ,这就是所需要的(给出一个4x4matrix的值)。
现在当我们这样做时,{1,2,3,4}中的每个值都是<= 4(N6值),但是只有3个是<= 3(N5值),只有2个是<= 2(N4值)传递给PERCENTILE
函数的数组正确地返回10个值,2个75个值,3个15个值和4个23个值(其他值是“”,PERCENTILE忽略的空白)
我的例子的结果是15和原来的公式也给出15 …….但如上所述,原来的公式可能会得到不正确的结果与更大的数字 – 例如,我在Excel 2007中testing兼容模式,如果我把N4换成4000,把N6换成1000,我现在预计结果是75(这是我的公式给出的结果)…..但是原来的公式给出了23。
- 最里面的操作是
MAX(Data!N3:N15)
并且这在M3:M15
范围内查找最高值。 假设最大值是10。 - 第二个操作是
INDIRECT("1:"&10)
,这个INDIRECT
变成了1:10
的范围。 -
COLUMN
返回一个数组,其中包含范围1:10
的列号。 (如果是范围A1:B1
,则得到数组{1,2}
,如果是B1:D1
,则数组为{2,3,4}
,因此COLUMN(1:10)
返回{1, 2, 3, etc...}
。 -
Data!N3:N15
应该很容易理解。 范围本身是一个数组。 假设它包含值:{2, 3, , 5, etc...}
-
比较:
{1, 2, 3, etc...} <= {2, 3, , 5, etc...}
。 如果比较满足,则返回范围Data!M3:M15
。 假设这个包含{15, 14, 13, 12, 11, etc... }
。- 第一次比较:1 <= 2(两个数组的第一个元素)是真的,因此返回
15
。 - 第二个比较:2 <= 3(两个数组的第二个元素)是真的,因此返回
14
。 - 第三个比较:3 <=“”(两个数组的第三个元素)是错误的,因此,返回
""
作为IF
其他结果。 - 等等…
由此产生的数组
{15, 14, "", 12, etc... }
15,14{15, 14, "", 12, etc... }
。 - 第一次比较:1 <= 2(两个数组的第一个元素)是真的,因此返回
-
获取这个数组的百分位数。
由于这是一个数组公式,所以必须使用公式Ctrl + Shift + Enter 。 每当你这样做,括号自动包裹公式。
附录我没有得到更早的补充(这一点是我会看到巴里胡迪尼的答案之前):
无论N3:N15
范围内的最大值(除了那些取决于excel版本的256或16384), COLUMN(INDIRECT("1:"&MAX(Data!N3:N15)))
将返回一个常数值,我相信这个公式在某种程度上是错误的。
更好的解释,请看barry houdini的回答 。
回答问题的第一部分 – 大括号表示数组公式(函数)。 PERCENTILE
function就是其中之一。 要input公式,您需要使用:CTRL + SHIFT + ENTER,纯粹的ENTER是不够的。
你可以在这里阅读更多