使用查询拆分数据以计算公式仅适用于一列
Splitting Data with query to calculate formulas only works on one column
我有数据 sheets,如果需要的话,我会为将来的数据提供更多的数据集区域。当仅使用范围内的一列时,我有多个公式可以使用。如果范围不止一列,但数据位于第一列,则会出错。如果数据在定义范围内的第二列或更多列中,它将只计算第一列。
注意:我将数据压缩为一个值,并用一个值表示数量,如下所示:VALUE (X)
和我想保持这种方式,因为数据 sheet 非常大并且所有值都已输入。
示例公式适用于单个范围列:
中位数
=ARRAYFORMULA(MEDIAN(TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,1)&"♦", INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,2)),,999^99), "♦"))))
如果我尝试增加范围 B18:F
公式将只适用于填充两列或更多列。它也只会计算第一列。
唯一可行的解决方案是在该范围内添加每个转置列 MEDIAN( data here )
下面的示例:
=ARRAYFORMULA(MEDIAN(
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,1)&"♦", INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(C18:C="",,SPLIT(IF(ISNUMBER(C18:C), C18:C&" 1", C18:C), " ()"))*1,,1)&"♦", INDEX(IF(C18:C="",,SPLIT(IF(ISNUMBER(C18:C), C18:C&" 1", C18:C), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(D18:D="",,SPLIT(IF(ISNUMBER(D18:D), D18:D&" 1", D18:D), " ()"))*1,,1)&"♦", INDEX(IF(D18:D="",,SPLIT(IF(ISNUMBER(D18:D), D18:D&" 1", D18:D), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(E18:E="",,SPLIT(IF(ISNUMBER(E18:E), E18:E&" 1", E18:E), " ()"))*1,,1)&"♦", INDEX(IF(E18:E="",,SPLIT(IF(ISNUMBER(E18:E), E18:E&" 1", E18:E), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(F18:F="",,SPLIT(IF(ISNUMBER(F18:F), F18:F&" 1", F18:F), " ()"))*1,,1)&"♦", INDEX(IF(F18:F="",,SPLIT(IF(ISNUMBER(F18:F), F18:F&" 1", F18:F), " ()"))*1,,2)),,999^99), "♦"))))
这适用于中位数、众数、标准差和平均差。但是,它绝对不适用于 IQR。我不确定为什么。
IQR
=ARRAYFORMULA(QUARTILE(TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,1)&"♦", INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(C18:C="",,SPLIT(IF(ISNUMBER(C18:C), C18:C&" 1", C18:C), " ()"))*1,,1)&"♦", INDEX(IF(C18:C="",,SPLIT(IF(ISNUMBER(C18:C), C18:C&" 1", C18:C), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(D18:D="",,SPLIT(IF(ISNUMBER(D18:D), D18:D&" 1", D18:D), " ()"))*1,,1)&"♦", INDEX(IF(D18:D="",,SPLIT(IF(ISNUMBER(D18:D), D18:D&" 1", D18:D), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(E18:E="",,SPLIT(IF(ISNUMBER(E18:E), E18:E&" 1", E18:E), " ()"))*1,,1)&"♦", INDEX(IF(E18:E="",,SPLIT(IF(ISNUMBER(E18:E), E18:E&" 1", E18:E), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(F18:F="",,SPLIT(IF(ISNUMBER(F18:F), F18:F&" 1", F18:F), " ()"))*1,,1)&"♦", INDEX(IF(F18:F="",,SPLIT(IF(ISNUMBER(F18:F), F18:F&" 1", F18:F), " ()"))*1,,2)),,999^99), "♦")), 3)-QUARTILE(TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,1)&"♦", INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(C18:C="",,SPLIT(IF(ISNUMBER(C18:C), C18:C&" 1", C18:C), " ()"))*1,,1)&"♦", INDEX(IF(C18:C="",,SPLIT(IF(ISNUMBER(C18:C), C18:C&" 1", C18:C), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(D18:D="",,SPLIT(IF(ISNUMBER(D18:D), D18:D&" 1", D18:D), " ()"))*1,,1)&"♦", INDEX(IF(D18:D="",,SPLIT(IF(ISNUMBER(D18:D), D18:D&" 1", D18:D), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(E18:E="",,SPLIT(IF(ISNUMBER(E18:E), E18:E&" 1", E18:E), " ()"))*1,,1)&"♦", INDEX(IF(E18:E="",,SPLIT(IF(ISNUMBER(E18:E), E18:E&" 1", E18:E), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(F18:F="",,SPLIT(IF(ISNUMBER(F18:F), F18:F&" 1", F18:F), " ()"))*1,,1)&"♦", INDEX(IF(F18:F="",,SPLIT(IF(ISNUMBER(F18:F), F18:F&" 1", F18:F), " ()"))*1,,2)),,999^99), "♦")), 1))
我试图通过使用 {B18:B,C18:C,D18:D,E18:E,F18:F}
来缩小范围,除非它是单列 B18:B
。
公式能否在超过一列且其余列为空的范围内查找?本质上是使公式更小。
为什么IQR不把每个范围内的所有数据作为一个洞来计算IQR。 (数据 returns 6 个值而不是 2 个)
谢谢。
https://docs.google.com/spreadsheets/d/1byR6Aw3lTImxNHDynTm5S1MWjpxmCuMyNl5WT9PcC1E/edit?usp=sharing
将列连接在一起,而不是单独拼接每列的公式。使用 {Range;Range}
.
将列连接在一起
上面的示例较小,将列垂直连接成一个范围。
使用:
中位数
=ARRAYFORMULA(MEDIAN(TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF({A13:A;B13:B;C13:C;D13:D;E13:E}="",,SPLIT(IF(ISNUMBER({A13:A;B13:B;C13:C;D13:D;E13:E}), {A13:A;B13:B;C13:C;D13:D;E13:E}&" 1", {A13:A;B13:B;C13:C;D13:D;E13:E}), " ()"))*1,,1)&"♦", INDEX(IF({A13:A;B13:B;C13:C;D13:D;E13:E}="",,SPLIT(IF(ISNUMBER({A13:A;B13:B;C13:C;D13:D;E13:E}), {A13:A;B13:B;C13:C;D13:D;E13:E}&" 1", {A13:A;B13:B;C13:C;D13:D;E13:E}), " ()"))*1,,2)),,999^99), "♦"))))
注意:{A13:A;B13:B;C13:C;D13:D;E13:E}
我有数据 sheets,如果需要的话,我会为将来的数据提供更多的数据集区域。当仅使用范围内的一列时,我有多个公式可以使用。如果范围不止一列,但数据位于第一列,则会出错。如果数据在定义范围内的第二列或更多列中,它将只计算第一列。
注意:我将数据压缩为一个值,并用一个值表示数量,如下所示:VALUE (X)
和我想保持这种方式,因为数据 sheet 非常大并且所有值都已输入。
示例公式适用于单个范围列:
中位数
=ARRAYFORMULA(MEDIAN(TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,1)&"♦", INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,2)),,999^99), "♦"))))
如果我尝试增加范围 B18:F
公式将只适用于填充两列或更多列。它也只会计算第一列。
唯一可行的解决方案是在该范围内添加每个转置列 MEDIAN( data here )
下面的示例:
=ARRAYFORMULA(MEDIAN(
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,1)&"♦", INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(C18:C="",,SPLIT(IF(ISNUMBER(C18:C), C18:C&" 1", C18:C), " ()"))*1,,1)&"♦", INDEX(IF(C18:C="",,SPLIT(IF(ISNUMBER(C18:C), C18:C&" 1", C18:C), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(D18:D="",,SPLIT(IF(ISNUMBER(D18:D), D18:D&" 1", D18:D), " ()"))*1,,1)&"♦", INDEX(IF(D18:D="",,SPLIT(IF(ISNUMBER(D18:D), D18:D&" 1", D18:D), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(E18:E="",,SPLIT(IF(ISNUMBER(E18:E), E18:E&" 1", E18:E), " ()"))*1,,1)&"♦", INDEX(IF(E18:E="",,SPLIT(IF(ISNUMBER(E18:E), E18:E&" 1", E18:E), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(F18:F="",,SPLIT(IF(ISNUMBER(F18:F), F18:F&" 1", F18:F), " ()"))*1,,1)&"♦", INDEX(IF(F18:F="",,SPLIT(IF(ISNUMBER(F18:F), F18:F&" 1", F18:F), " ()"))*1,,2)),,999^99), "♦"))))
这适用于中位数、众数、标准差和平均差。但是,它绝对不适用于 IQR。我不确定为什么。
IQR
=ARRAYFORMULA(QUARTILE(TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,1)&"♦", INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(C18:C="",,SPLIT(IF(ISNUMBER(C18:C), C18:C&" 1", C18:C), " ()"))*1,,1)&"♦", INDEX(IF(C18:C="",,SPLIT(IF(ISNUMBER(C18:C), C18:C&" 1", C18:C), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(D18:D="",,SPLIT(IF(ISNUMBER(D18:D), D18:D&" 1", D18:D), " ()"))*1,,1)&"♦", INDEX(IF(D18:D="",,SPLIT(IF(ISNUMBER(D18:D), D18:D&" 1", D18:D), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(E18:E="",,SPLIT(IF(ISNUMBER(E18:E), E18:E&" 1", E18:E), " ()"))*1,,1)&"♦", INDEX(IF(E18:E="",,SPLIT(IF(ISNUMBER(E18:E), E18:E&" 1", E18:E), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(F18:F="",,SPLIT(IF(ISNUMBER(F18:F), F18:F&" 1", F18:F), " ()"))*1,,1)&"♦", INDEX(IF(F18:F="",,SPLIT(IF(ISNUMBER(F18:F), F18:F&" 1", F18:F), " ()"))*1,,2)),,999^99), "♦")), 3)-QUARTILE(TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,1)&"♦", INDEX(IF(B18:B="",,SPLIT(IF(ISNUMBER(B18:B), B18:B&" 1", B18:B), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(C18:C="",,SPLIT(IF(ISNUMBER(C18:C), C18:C&" 1", C18:C), " ()"))*1,,1)&"♦", INDEX(IF(C18:C="",,SPLIT(IF(ISNUMBER(C18:C), C18:C&" 1", C18:C), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(D18:D="",,SPLIT(IF(ISNUMBER(D18:D), D18:D&" 1", D18:D), " ()"))*1,,1)&"♦", INDEX(IF(D18:D="",,SPLIT(IF(ISNUMBER(D18:D), D18:D&" 1", D18:D), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(E18:E="",,SPLIT(IF(ISNUMBER(E18:E), E18:E&" 1", E18:E), " ()"))*1,,1)&"♦", INDEX(IF(E18:E="",,SPLIT(IF(ISNUMBER(E18:E), E18:E&" 1", E18:E), " ()"))*1,,2)),,999^99), "♦")),
TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF(F18:F="",,SPLIT(IF(ISNUMBER(F18:F), F18:F&" 1", F18:F), " ()"))*1,,1)&"♦", INDEX(IF(F18:F="",,SPLIT(IF(ISNUMBER(F18:F), F18:F&" 1", F18:F), " ()"))*1,,2)),,999^99), "♦")), 1))
我试图通过使用 {B18:B,C18:C,D18:D,E18:E,F18:F}
来缩小范围,除非它是单列 B18:B
。
公式能否在超过一列且其余列为空的范围内查找?本质上是使公式更小。
为什么IQR不把每个范围内的所有数据作为一个洞来计算IQR。 (数据 returns 6 个值而不是 2 个)
谢谢。
https://docs.google.com/spreadsheets/d/1byR6Aw3lTImxNHDynTm5S1MWjpxmCuMyNl5WT9PcC1E/edit?usp=sharing
将列连接在一起,而不是单独拼接每列的公式。使用 {Range;Range}
.
上面的示例较小,将列垂直连接成一个范围。
使用: 中位数
=ARRAYFORMULA(MEDIAN(TRANSPOSE(SPLIT(QUERY(REPT( INDEX(IF({A13:A;B13:B;C13:C;D13:D;E13:E}="",,SPLIT(IF(ISNUMBER({A13:A;B13:B;C13:C;D13:D;E13:E}), {A13:A;B13:B;C13:C;D13:D;E13:E}&" 1", {A13:A;B13:B;C13:C;D13:D;E13:E}), " ()"))*1,,1)&"♦", INDEX(IF({A13:A;B13:B;C13:C;D13:D;E13:E}="",,SPLIT(IF(ISNUMBER({A13:A;B13:B;C13:C;D13:D;E13:E}), {A13:A;B13:B;C13:C;D13:D;E13:E}&" 1", {A13:A;B13:B;C13:C;D13:D;E13:E}), " ()"))*1,,2)),,999^99), "♦"))))
注意:{A13:A;B13:B;C13:C;D13:D;E13:E}