Excel:解决数组之间的差异(多列平均)的标准偏差

时间:2019-01-19 13:05:10

标签: arrays excel array-formulas standard-deviation

我有一个矩阵:

A   B   C   D   E   F
4   10  2   2   1   1
            3   7   9
2   6   6           
2       10  2   0   4
2   0   1       6   5

2   6   4   5   0   6
3               8   
5   1   10  2   2   8

我想找到列A:C和D:F的平均值之间的行差异的标准偏差(STDEV.S)。至关重要的是,我只想为A:C和D:F列中具有完整条目的行计算此值(例如,无空格)。

在此示例中,标准偏差为1.9。让我们分解一下。首先,我们确定A:C和D:F列的行平均(请参阅下面的G和H列)。请注意,这仅针对行1、7和9进行了计算,因为它们是A:F列中唯一具有完整数据的行:

A   B   C   D   E   F   G   H
4   10  2   2   1   1   5.3 1.3
            3   7   9       
2   6   6                   
2       10  2   0   4       
2   0   1       6   5       

2   6   4   5   0   6   4   3.7
3               8           
5   1   10  2   2   8   5.3 4

然后,我们计算G列和H列之间的行差异(请参见I列):

A   B   C   D   E   F   G   H   I
4   10  2   2   1   1   5.3 1.3 4
            3   7   9           
2   6   6                       
2       10  2   0   4           
2   0   1       6   5           

2   6   4   5   0   6   4   3.7 0.3
3               8               
5   1   10  2   2   8   5.3 4   1.3

最后计算出列I的标准偏差为1.9。

我希望在单个数组公式中实现此目标。我已经尝试了以下操作,但失败了:

尝试1:

{=STDEV.S(AVERAGE(IF(SUBTOTAL(2,OFFSET(A1,ROW(A1:A9)-ROW(A1),0,1,COLUMNS(A1:C1)))=COLUMNS(A1:A1),IF(SUBTOTAL(2,OFFSET(D1,ROW(D1:D9)-ROW(D1),0,1,COLUMNS(D1:F1)))=COLUMNS(D1:F1),SUBTOTAL(1,OFFSET(A1,ROW(A1:A9)-ROW(A1),0,1,COLUMNS(A1:C1)))))))-(AVERAGE(IF(SUBTOTAL(2,OFFSET(A1,ROW(A1:A9)-ROW(A1),0,1,COLUMNS(A1:C1)))=COLUMNS(A1:C1),IF(SUBTOTAL(2,OFFSET(D1,ROW(D1:D9)-ROW(D1),0,1,COLUMNS(D1:F1)))=COLUMNS(D1:F1),SUBTOTAL(1,OFFSET(D1,ROW(D1:D9)-ROW(D1),0,1,COLUMNS(D1:F1)))))))}

结果为#DIV / 0! Ctrl + Shift + Enter输入后警告

尝试2:

我使用以下公式成功计算了两列(而不是两个平均列)之间的差异的标准偏差(在这种情况下,我们对A列和B列之间的差异的SD感兴趣):

{=STDEV(IF(A1:A9<>"",IF(B1:B9<>"",A1:A9-B1:B9)))}

我自己不能完全修改此代码,但也许有人会觉得它有用。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

主要问题是,您正在使用SUBTOTAL(1 ...来获取AC列的平均值,而分别使用DFTO列来获取平均值,但是还使用AVERAGE来获取平均值列的平均值–距离太远了。是您尝试使用单个数字的stdev来获取#DIV / 0!

如果您将它们取出并进行一些小调整,您会得到

=STDEV.S(IF(SUBTOTAL(2,OFFSET(A1,ROW(A1:A9)-ROW(A1),0,1,COLUMNS(A1:C1)))=COLUMNS(A1:C1),IF(SUBTOTAL(2,OFFSET(D1,ROW(D1:D9)-ROW(D1),0,1,COLUMNS(D1:F1)))=COLUMNS(D1:F1),SUBTOTAL(1,OFFSET(A1,ROW(A1:A9)-ROW(A1),0,1,COLUMNS(A1:C1)))))-IF(SUBTOTAL(2,OFFSET(A1,ROW(A1:A9)-ROW(A1),0,1,COLUMNS(A1:C1)))=COLUMNS(A1:C1),IF(SUBTOTAL(2,OFFSET(D1,ROW(D1:D9)-ROW(D1),0,1,COLUMNS(D1:F1)))=COLUMNS(D1:F1),SUBTOTAL(1,OFFSET(D1,ROW(D1:D9)-ROW(D1),0,1,COLUMNS(D1:F1))))))

,结果为1.3。为什么这是错误的答案?不幸的是,当您在col AC或DF中获得一个空白单元格时,您的If语句的计算结果为FALSE,在某些情况下,您最终得到FALSE-FALSE的结果为0,并为您提供了一个STDEV包含的数值,并给出了错误的信息结果。

您可以通过用文字重构公式来解决问题

If first block is complete
    If second block is complete
        Calculate and subtract means
Take Stdev of result

给出

=STDEV.S(
IF(SUBTOTAL(2,OFFSET(A1,ROW(A1:A9)-ROW(A1),0,1,COLUMNS(A1:C1)))=COLUMNS(A1:C1),
     IF(SUBTOTAL(2,OFFSET(D1,ROW(D1:D9)-ROW(D1),0,1,COLUMNS(D1:F1)))=COLUMNS(D1:F1),
          SUBTOTAL(1,OFFSET(A1,ROW(A1:A9)-ROW(A1),0,1,COLUMNS(A1:C1)))-SUBTOTAL(1,OFFSET(D1,ROW(A1:A9)-ROW(A1),0,1,COLUMNS(D1:F1)))))
)