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
我正在寻找一种方法来仅计算
- odd-row "blues" 和 "reds"(在两个不同的公式中)
- 没有星号
它不会被以下原因绊倒:
- B3中的附加“-xx”。
- non-header 个偶数单元格中存在字符串 "blue" 或 "red"(D2="BLUE jay";B4="barRED owl";C4="RED hawk")
假设我已经通过其他方法知道有 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" 值。
我一直在研究这个问题。
我有一个数组,它由奇数行上的一种类型的东西(如 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
我正在寻找一种方法来仅计算
- odd-row "blues" 和 "reds"(在两个不同的公式中)
- 没有星号
它不会被以下原因绊倒:
- B3中的附加“-xx”。
- non-header 个偶数单元格中存在字符串 "blue" 或 "red"(D2="BLUE jay";B4="barRED owl";C4="RED hawk")
假设我已经通过其他方法知道有 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" 值。