いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

(Gスプレッドシート)最も多い文字列を取得する

 Googleスプレッドシートで、多数の文字列のうち最も多く出現しているものを、関数を使って取得する方法についてです。
 数値の場合はMODE関数が使えますが、文字列の場合は少し工夫が必要です。

  • INDEX関数やMODE関数等の組み合わせにより、最も多い文字列を取得することができます。
  • 文字列と数値が混合する場合や、数値だけの場合でも取得できます。
  • 最も多い値が複数ある場合にすべてを取得するには、別の式を考える必要があります。

手順

最も多い文字列を1つだけ取得する方法

f:id:accs2014:20201108111239p:plain:right:w500

 画像では、B3:B9に並んだ7つの文字列から最も多く出現しているものを関数で取得しています。
 D3セルに入力されている式は次のようなものです。

 D3セル

=INDEX(B2:B9,MODE(MATCH(B2:B9,B2:B9,0)))

 「MATCH(B2:B9,B2:B9,0)」により、「それぞれの文字列が最初に出現する位置」を取得しています。さらにそれをMODE関数で囲むことにより、「最も多く出現する文字列が最初に出現する位置」を取得しています。この値をINDEX関数と組み合わせることで最も多く出現している文字列を取得しています。
 MATCH関数が「最初の出現位置」を取得することを利用していてなかなか巧妙です。
 なお、文字列と数値が混じっている場合でも最も多く出現するものを取得できます。数値だけでも同様です。
 ただし最も多く出現する値が2つ以上ある場合でも、そのうち1つ(最初に出現するもの)しか取得できません。

最も多い文字列をすべて取得する方法

f:id:accs2014:20201108111243p:plain:right:w600

 こちらの例では、最も多く出現する文字列が複数存在します(ラーメンとカレーの2種類)。
 上記の例の式中のMODE関数をMODE.MULTに変更してARRAYFORMULAを加えれば両方取得できそうに見えますが、INDEX関数との相性が悪いため実際には1つしか取得できません。そこでもう少し地道な式で2つの文字列を取得しています。

 D3セル

=UNIQUE(FILTER(B3:B9,COUNTIF(B3:B9,B3:B9)=MAX(COUNTIF(B3:B9,B3:B9))))

 FILTER関数を使ってそれぞれの文字列とその出現回数(「COUNTIF(B3:B9,B3:B9)」)を結び付け、出現回数が最も多いものを抽出しています。ただし文字列の重複が生じるため、最後にUNIQUE関数で重複を除いています。
 なお、文字列と数値が混じっている場合でも最も多く出現するものを取得できます。数値だけでも同様です。