多列中的条件平均值

时间:2021-07-27 03:16:26

标签: excel-formula

我有一个电子表格,其中包含一匹马在多个赛马中的结果,格式如下:

    1000m          1200m
Place    Gate   Place   Gate
3        5      8       10
1        8      2       12

等等。我想收集有关马是否从某些门表现更好的数据。所以我有我想要填充的下表:

                    Gate    1    2    3    4    5    6    7    8    9    10    11    12
Average position by gate

因此,对于每个“Place”列,我需要搜索“Gate”列读取为 1、2、3 等的单元格,然后对这些值求平均值。我怎样才能做到这一点?我试过 AVERAGEIF,但我一次只能在一个距离上使用它。我需要一种方法来在所有“地点”和“门”列中执行此操作。

2 个答案:

答案 0 :(得分:0)

如果您拥有最新版本的 Excel,则采用一种蛮力方法:

=IFERROR(FIXED(LET(gate, TEXTJOIN(",", 1,$B$3:$B$10,$D$3:$D$10,$F$3:$F$10),
place, TEXTJOIN(",", 1, $A$3:$A$10,$C$3:$C$10,$E$3:$E$10),
x, FILTERXML("<t><s>"&SUBSTITUTE(gate, ",", "</s><s>")&"</s></t>", "//s"),
y, FILTERXML("<t><s>"&SUBSTITUTE(place, ",", "</s><s>")&"</s></t>", "//s"),
AVERAGE(FILTER(y, x=A13)))),"")

enter image description here

该解决方案依赖于 LET 函数。首先,我们使用 TEXTJOIN 将门(位置)数据连接到一个单独的字符串中,不考虑距离。接下来,我们将这些数据一起附加到一个带有 FILTERXML 的动态数组中。最后,我们将位置数组 FILTER 仅包含在给定门位置发生的位置的数组,并对其进行平均。为实现最佳实践,我们将整个函数包装在 IFERROR 中,并将结果格式化为显示两位小数,并带有 FIXED

我相信有人有更优雅的解决方案。

答案 1 :(得分:0)

如果您有 Excel 365,您可以:

=LET( matrix, A3:F17,
       gates, SEQUENCE(1,12),
       rdC, COLUMNS( matrix ), rdCells, ROWS( matrix ) * rdC,
       rdIR, SEQUENCE( 1, rdCells, 0 ),
       wrR, ROUNDUP( rdCells/2, 0),  wrCells, wrR * 2,
       wrIR, SEQUENCE( wrR, 2, 0 ),
       mux, INDEX( matrix, rdIR/rdC + 1, MOD( rdIR, rdC ) + 1 ),
       demux, INDEX( mux, wrIR/wrCells +  1,  MOD( wrIR, wrCells ) + 1 ),
       m, (INDEX(demux,,2)=gates)*INDEX(demux,,1),
       ones, SIGN( SEQUENCE( 1, ROWS( m ) ) ),
       CHOOSE( {1;2}, gates, IFERROR( MMULT( ones, m ) / MMULT( ones, SIGN(m) ), "") )
     )

其中 ma​​trix 是要分析的 PlaceGate 列的范围。

result

前几行旨在将矩阵重塑为两列 Place 和 Gate,称为 demux(我重用了我为重塑数组而编写的公式,因此 mux > 和 demux 旨在将 矩阵 多路复用为一行,然后将其多路复用为所需的新形状的成对列。

m 拿起 demux 并将其变成 races X 带结果的矩阵(其中 no-result = 0)。 ones 用于通过 MMULT 创建每列的总和,然后除以每列的计数以创建平均值:

MMULT( ones, m ) / MMULT( ones, SIGN(m) )

这被包装在一个 IFERROR 中,用 "" 替换 div/0 错误 - 你可以将它更改为你想要的 - 也许你希望它是 div/0 因为这就是 AVERAGE无论如何都要交付

CHOOSE 只是将结果以您在问题中提出的形式拼接在一起。