Google Sheets / Count 仅在数组的奇数行中的实例

Google Sheets / Count instances in only odd rows of an array

我一直在研究这个问题。

我有一个数组,它由奇数行上的一种类型的东西(如 header)和偶数行上的数据组成。这是一个 4x4 单元示例(实际上包含 8 个 header 和 8 个数据元素):

     A            B              C             D
 +---------------------------------------------------
1| *Red         *Blue          Blue          Blue
2| Robin        Sparrow        Oriole        Blue Jay
3| *Blue        Blue-xx        *Red          Red
4| Thrush       Barred Owl     Red Hawk      Eagle      

我正在寻找一种方法来仅计算

它不会被以下原因绊倒:

假设我已经通过其他方法知道有 5 个蓝色和 3 个红色 header 值开头,所有这些值都以星号开头。我更希望解决方案只计算那些没有星号的单元格,但由于我所说的假设,解决方案只计算那些确实有星号然后减去的单元格是可以的。

因此 "blue" 公式应报告有 3 个 odd-row "blues" 没有星号(C1、D1、B3)。

"red" 公式应报告有 2 个 odd-row "reds" 没有星号 (A1, C3)。

目前,我有这个丑陋的东西:

=if({Five original blues})-(COUNTIF($A:$B,"blue")+countif($A:$B,"blue"))>0,{Five original blues}-(countif($A:$B,"blue")+countif($A:$B,"blue")),"Zero")

或者,解析它,如果 (5 - ((blues on line 1)+(blues on line 3)) 为正数,则显示该数字。如果不是正数,则写出单词零。

=if(
     {Five original blues}) -  
     (COUNTIF($A:$B,"blue")+COUNTIF($A:$B,"blue"))
    >0
   ,
     {Five original blues} -
     (COUNTIF($A:$B,"blue")+COUNTIF($A:$B,"blue"))
   ,
     "Zero"
 )

正如预期的那样,输出为三。

对于我的 8 个数据点和两个 header 行来说,这不是一个糟糕的解决方案,但我希望至少有十个 header 行并且这不能很好地扩展。

我一直在尝试各种事情,比如

    - (if(isodd(row(A1:B4)) . . . 
    - countif(A1:B4,and(isodd(row(A1:B4)),find("blue",A1:B4) ...
    - arrayformula ...?

但是还没想好

提前致谢!

要计算 'Blue' 不带星号的出现次数,请尝试

=SUM(ARRAYFORMULA(N(REGEXMATCH(SUBSTITUTE(FILTER(A1:D4, ISODD(ROW(A1:A4))),"*B",""), "Blue"))))

对于偶数行,尝试

=SUM(ARRAYFORMULA(N(REGEXMATCH(SUBSTITUTE(FILTER(B1:E4, ISEVEN(ROW(B1:B4))),"*B",""), "Blue"))))

这对我有用,使用上面示例中的数组大小:

countif(filter(A1:B4,isodd(row(A1:B4))),"~*BLUE")

细分:

1. Filter(A1:B4,isodd(row(A1:B4)))

这只生成数组的奇数行,为了便于引用,我将其称为 OddsOnly

      A            B              C             D
  +---------------------------------------------------
1'| *Red         *Blue          Blue          Blue
3'| *Blue        Blue-xx        *Red          Red

然后

2. countif(OddsOnly,"~*BLUE")

我了解到*是一个通配符!因此,要转义字符,请使用代字号。上面的公式(2)统计了OddsOnly单元格中字符串*BLUE的所有实例,足以满足我的需求

请注意,我根本不需要 ARRAYFORMULA。以下两个公式产生相同的结果:

without ARRAYFORMULA: countif(filter(A1:B4,isodd(row(A1:B4))),"~*BLUE")
with    ARRAYFORMULA: countif(arrayformula(filter(A1:B4,isodd(row(A1:B4)))),"~*BLUE")

我使用的公式略有不同。请检查:

=COUNTIF(ARRAYFORMULA(IF(ISODD(ROW(A1:D4))=TRUE,A1:D4)),"Blue")

根据您的规则,它避免了带有星号和后缀的 "Blue" 值。