用标准函数替换 Google 工作表中的自定义函数
Replace custom function in Google Sheets with standard functions
我有一系列单元格,我想计算一列在其给定行中具有最大值的次数。
样本:
headers -> a b c d e f g h
0 0 12 18* 1 0 0 0
30* 0 15 25 0 0 0 0
35 0 19 31 0 0 31 50*
40 10 19 31 0 2 5 55*
预计:
#max val per row-> 1 0 0 1 0 0 0 2
最大值标有星号。 a
列得分 1,因为它在第二个数据行中具有最大值,列 d
也得分 1,因为它在第一个数据行和列 [=16= 中具有最大值] 得分 2,因为它在第三和第四数据行中具有最大值。其余列在任何行中都没有最大值,因此它们的值为 0。
对于一行,我可以为每一列复制这个公式并且它会这样做,但我需要一些应用最大值的东西 row-wise COUNTIF(B2:B10, MAX($B2:$B10))
.
我写了这个 google 应用程序脚本,但我不喜欢它的响应速度(与您获得的敏捷相比,在单元格中看到 "Loading..." 几乎一秒钟有点令人恼火具有本机功能):
function countMaxInRange(input) {
return [input.map(function(row) {
var m = Math.max.apply(null, row);
return row.map(function(x){return x === m && 1 || 0});
}).reduce(function(a, b){
var s = Array(a.length);
for (var i = 0; i < a.length; i++) {
s[i] = (a[i] + b[i]) || 0;
}
return s;
})];
}
关于如何用内置函数替换该代码的任何想法?我不关心添加辅助行或列,只要它们的数量是恒定的(也就是说,如果我扩展我的数据集,我不想为每个新数据行或列手动添加更多辅助行或列).
我想我可以添加一个额外的列来收集每行具有最大值的列的 header;然后为每个数据列计算他们的 header 在该辅助列中出现的次数,但看起来不是很干净。
公式
=ArrayFormula(TRANSPOSE(
MMULT(
N(TRANSPOSE(NamedRange1)
=
INDEX(
QUERY(TRANSPOSE(NamedRange1),
"SELECT "&JOIN(",",("MAX(Col"&TRANSPOSE(ROW(NamedRange1))-INDEX(ROW(NamedRange1),1)+1)&")"
)),
2)
),
SIGN(ROW(NamedRange1))
)
))
其中 NamedRange1
是指范围的命名范围。
条件格式:
- 适用范围:
A1:H4
- 自定义公式:
=A1=MAX($A1:$H1)
解释
总结
上面的公式不需要额外的列,只是将范围设置为命名范围。公式中使用了NamedRange1
,但可以根据您的喜好进行定制。
结果是一个 1 x n
数组,其中 n
是 NamedRange1
的列数。每列将包含相应列上 行 的最大值出现次数。
精选“技巧”
- ARRAYFORMULA returns 值数组。
- 大于 1 x 1 的范围作为数组处理。
- 将数组用作某些函数和运算符的参数的工作方式与循环类似。在本例中,此功能用于创建一个 SQL 语句以获取输入数据每一列的最大值。请注意,QUERY 的输入数据是
NamedRange1
. 的转置
- N 将 TRUE/FALSE 值分别强制为 1/0。
- MMULT 用于按行求和
注意:插入图像上显示的 +0 是为了强制 Google 工作表保留在编辑公式时引入的断线而没有断线,因为如果公式没有重大变化,断线由于 Google 工作表的 formula/result 缓存功能,自动删除。
参考
MMULT Usage 作者:亚当·拉斯克。
我有一系列单元格,我想计算一列在其给定行中具有最大值的次数。
样本:
headers -> a b c d e f g h
0 0 12 18* 1 0 0 0
30* 0 15 25 0 0 0 0
35 0 19 31 0 0 31 50*
40 10 19 31 0 2 5 55*
预计:
#max val per row-> 1 0 0 1 0 0 0 2
最大值标有星号。 a
列得分 1,因为它在第二个数据行中具有最大值,列 d
也得分 1,因为它在第一个数据行和列 [=16= 中具有最大值] 得分 2,因为它在第三和第四数据行中具有最大值。其余列在任何行中都没有最大值,因此它们的值为 0。
对于一行,我可以为每一列复制这个公式并且它会这样做,但我需要一些应用最大值的东西 row-wise COUNTIF(B2:B10, MAX($B2:$B10))
.
我写了这个 google 应用程序脚本,但我不喜欢它的响应速度(与您获得的敏捷相比,在单元格中看到 "Loading..." 几乎一秒钟有点令人恼火具有本机功能):
function countMaxInRange(input) {
return [input.map(function(row) {
var m = Math.max.apply(null, row);
return row.map(function(x){return x === m && 1 || 0});
}).reduce(function(a, b){
var s = Array(a.length);
for (var i = 0; i < a.length; i++) {
s[i] = (a[i] + b[i]) || 0;
}
return s;
})];
}
关于如何用内置函数替换该代码的任何想法?我不关心添加辅助行或列,只要它们的数量是恒定的(也就是说,如果我扩展我的数据集,我不想为每个新数据行或列手动添加更多辅助行或列).
我想我可以添加一个额外的列来收集每行具有最大值的列的 header;然后为每个数据列计算他们的 header 在该辅助列中出现的次数,但看起来不是很干净。
公式
=ArrayFormula(TRANSPOSE(
MMULT(
N(TRANSPOSE(NamedRange1)
=
INDEX(
QUERY(TRANSPOSE(NamedRange1),
"SELECT "&JOIN(",",("MAX(Col"&TRANSPOSE(ROW(NamedRange1))-INDEX(ROW(NamedRange1),1)+1)&")"
)),
2)
),
SIGN(ROW(NamedRange1))
)
))
其中 NamedRange1
是指范围的命名范围。
条件格式:
- 适用范围:
A1:H4
- 自定义公式:
=A1=MAX($A1:$H1)
解释
总结
上面的公式不需要额外的列,只是将范围设置为命名范围。公式中使用了NamedRange1
,但可以根据您的喜好进行定制。
结果是一个 1 x n
数组,其中 n
是 NamedRange1
的列数。每列将包含相应列上 行 的最大值出现次数。
精选“技巧”
- ARRAYFORMULA returns 值数组。
- 大于 1 x 1 的范围作为数组处理。
- 将数组用作某些函数和运算符的参数的工作方式与循环类似。在本例中,此功能用于创建一个 SQL 语句以获取输入数据每一列的最大值。请注意,QUERY 的输入数据是
NamedRange1
. 的转置
- N 将 TRUE/FALSE 值分别强制为 1/0。
- MMULT 用于按行求和
注意:插入图像上显示的 +0 是为了强制 Google 工作表保留在编辑公式时引入的断线而没有断线,因为如果公式没有重大变化,断线由于 Google 工作表的 formula/result 缓存功能,自动删除。
参考
MMULT Usage 作者:亚当·拉斯克。