1

セルの範囲があり、列が特定の行の最大値を持つ回数を増やしたいと考えています。

サンプル:

       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スコアは 2 番目のデータ行に最大値があるdため 1、列のスコアも 1 番目のデータ行に最大値があるため 1、列のhスコアは 3 番目と 4 番目のデータに最大値があるため 2 です。行。残りの列はどの行にも最大値がないため、0 になります。

1行だけで、各列にこの式をコピーできますが、それで十分ですが、 max row-wise を適用するものが必要ですCOUNTIF(B2:B10, MAX($B2:$B10))

私はこの Google Apps スクリプトを作成しましたが、その応答性が気に入りません (セルに "読み込み中..." がほぼ 1 秒間表示されるのは、ネイティブ関数で得られる迅速さと比較して、ちょっと腹立たしいことです)。

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;
  })];
}

そのコードを組み込み関数に置き換える方法についてのアイデアはありますか? 一定数の補助行または列を追加してもかまいません (つまり、データセットを拡張する場合、新しいデータ行または列ごとにヘルパー行または列を手動で追加したくありません)。 )。

各行の最大値を持つ列のヘッダーを収集する追加の列を追加できると思います。次に、各データ列について、ヘッダーがその補助列に表示される回数を数えますが、あまりきれいに見えません。

4

1 に答える 1

1

方式

=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 は、値の配列を返します。
  • 1 x 1 より大きい範囲は配列として処理されます。
  • 一部の関数や演算子で配列を引数として使用すると、ループと同様の方法で機能します。この場合、この機能を使用して SQL ステートメントを作成し、入力データの各列の最大値を取得します。QUERY の入力データは の転置であることに注意してくださいNamedRange1
  • N は TRUE/FALSE 値をそれぞれ 1/0 に強制します。
  • MMULT は、行ごとに合計を作成するために使用されます

注: 画像に表示されている +0 は、Google スプレッドシートでブレークラインなしの式の編集で導入されたブレークラインを保持するように強制するために挿入されました。これは、式に大きな変更がない場合、式/結果によりブレークラインが自動的に削除されるためです。 Google スプレッドシートのキャッシュ機能。

参照

Adam Lusk によるMMULT の使用法。

于 2016-10-27T18:09:38.123 に答える