获得不同人数的团体平均数

我感觉这几乎是不可能的,但是在这里。 我有这样的数据结构:

Test Group 1 pass fail pass fall Test Group 2 pass fail Test Group 3 pass fail fail pass 

我希望能够将其粘贴到Excel中,并用Excel汇总每个testing组的百分比。 所以最终会看起来像这样:

 Test Group 1 Percentage Pass: 50% pass fail pass fall Test Group 2 Percentage Pass: 50% pass fail Test Group 3 Percentage Pass: 50% pass fail fail pass 

但是你可以看到testing组的长度没有设置,可能会有所不同。 我希望能够创build一个遵循这个逻辑的公式:

 if( A<n> contains "Test") count A<n> +1 until A<n> contains "Test" 

这似乎是我从Excel公式问很多。 今天我花了一些时间编写一个小的C#应用​​程序,将configuration分割成单独的文件,以便我可以复制和粘贴到Excel单独的文件。 但是,拥有更less的步骤将是非常好的!

—更新—-

有三个非常有趣的方法来解决这个问题,certificate没有什么是不可能的

我想要一个解决scheme,允许我复制和粘贴结果,并看到一个百分比的负载popup,所以我总是在寻找一个公式解决scheme,但请花些时间看看pnuts和Jerrys的答案,因为它们揭示了一些有用的Excel的function!

chuffs答案是我正在寻找的那个,它开箱即用。 对于那些想要深入研究它是如何工作的人,为什么我把这个公式分解成几个步骤,并填写一些帮助信息。 这些公式的关键是结合MATCH,OFFSET和稍微更明显的SEARCH / FIND / LEFT(我曾经使用IFERROR(findtypes的方法,左看起来更干净:))

看看这些公式的文档,但看到它在一些例子的行动看到我创build详细chuffs的Google Spreadsheets答案:

https://docs.google.com/spreadsheet/ccc?key=0AqODI11eAjtldDhDd2dBcFhpZW9SXzEybGtMUWMwM3c#gid=0

— PS —为了logging,我实际上创build了一个C ++程序来美化我的数据,并将其输出为.csv文件。 如果我有这个信息,我不会感到困扰,但很高兴我尝试了两条路线,这是一个有趣的学习冒险。

这个问题的一个单一的数组公式解决scheme是可能的。 它只需要在数据列的底部添加一个停止值“testing”。

假设你的数据在A2:A18范围内,下面是计算单元格B2的平均值的公式:

  =IF(LEFT(A1,4)="Test", COUNTIF(OFFSET(A1,1,0,MATCH("Test*",$A2:$A$18,0)-1,1),"pass") / COUNTA(OFFSET(A1,1,0,MATCH("Test*",$A2:$A$18,0)-1,1)), "") 

公式的关键部分是计算两个计数函数COUNTIFCOUNTA的范围的expression式。

COUNTIF函数 – 计算组中的遍数 – 接受两个参数,计数范围和计数单元满足的条件。

我使用OFFSETfunction来提供计数范围。 OFFSET有五个参数:

  • 锚点单元格(如果提供范围,则该函数仅使用范围中的左上angular的单元格)。
  • (+)或以上( – )要返回范围的锚点单元格的行数将开始。
  • 返回范围开始的锚点单元右侧(+)或左侧( – )的列数。
  • 要返回的行数。
  • 要返回的列数。

例如, OFFSET(A1,5,2,4,1)将返回范围C6:D9

在公式中,锚点单元格为A1 ,行偏移量为1,列偏移量为0,换句话说,要返回的范围的起点为A2

返回的行数由MATCH函数计算。 为计算第一个testing组的平均值, MATCHA2:A18范围内查找以“Test”开始的第一个单元格的行。 A2是启动testing组的单元格下方的通过/失败列中的单元格。

列中的最后一个单元格是A18 ,它已被添加到数据中并包含单词“testing”。 这可以防止公式返回最后一个testing组的错误。 否则,匹配会返回一个错误,因为在最后一个组的开始之后找不到另一个Test

还要注意,匹配范围的定位点(即$A2:$A$18 )会将行引用保留到范围顶部( A2的2)。 这样,当公式被复制下来时,范围将向下调整,以find“testing”的下一个,而不是之前的出现。

最后,我将返回行数减1,以排除MATCHfind的属于下一个组的Text

COUNTA函数(计数传递总数并在组中失败)使用相同的OFFSET / MATCHexpression式来获取组的范围。

这是一个数组公式,因此必须用ControlShiftEnter组合 input 。 将公式向下复制到数据的底部(不包括具有“testing”停止值的单元格)以计算每个组的平均值。

为了方便起见,这里是没有上面显示的间隔的公式。 它可以直接粘贴到工作表中(记住用ControlShiftEnter确认 )。

  =IF(LEFT(A1,4)="Test",COUNTIF(OFFSET(A1,1,0,MATCH("Test*",$A2:$A$18,0)-1,1),"pass")/COUNTA(OFFSET(A1,1,0,MATCH("Test*",$A2:$A$18,0)-1,1)),"") 

电子表格结果

基本上小计可以满足要求, 只要一些相当繁琐的布局调整是可以接受的。

制备:
假设Test Group 1A1 ,在A2 =IF(LEFT(B2,1)="T",B2,"")C2 =IFERROR(MATCH(B2,{"fail","pass"},0)-1,"") =IF(LEFT(B2,1)="T",B2,"")中插入Row1和ColumnA =IFERROR(MATCH(B2,{"fail","pass"},0)-1,"")并根据需要复制两个公式。 (从源头上变成失败!)

小计:
selectA:C ,数据>大纲 – 小计,每次更改: (1) Test Group 1 ,使用函数: Average ,将小计添加到:检查(C列),取消选中数据下面的摘要,确定。

整理:
1.将A3:C3移至A1 ,将A2:C2移至A3
2.filterA:CColumnB ,文本filter,包含添加Test ,确定。
3.在C3 put ="Percentage Pass: "&C4*100&"%"并复制到以蓝色编号的最后一行(应该显示#DIV/0! )。
4.突出显示A:C ,所有行编号为蓝色和强化。
5.隐藏ColumnA并(可选)隐藏或删除Rows1:2
6.取消filterselect。

希望在左边做准备,结果会类似于右图所示:

SO16859574第一个例子


示例重新评论@杰里的答案:

SO16859574第二个例子

有很多方法可以解决这个问题 – 一个可能的简单的解决scheme是在通过/失败列旁边添加一列(假定列A):

=IF(A1="pass",100,0)

如果你这样做,那么这些值的平均值将等于通过的百分比。