複数の行にまたがる値を一つのセルに統合する(多値のセルを縦に結合)(Exploratory以外)

データラングリング

データラングリングで、以下のような例に出くわすことがある。

  • 事業本部と部署名をまとめた表がある。
  • 事業本部と複数の部署名を一対一で紐付けた「縦持ち」の表
  • これを事業本部と部署名を1対nで紐付けた表にしたい
  • 新しい表では、事業本部はユニークとなる

Excelで実行する方法

これをExcel(PowerQueryなし)で処理するには、以下のようにする。

  • 事業本部をユニーク化した列を作る
  • その事業本部名をFILTER関数で参照し、部署名の列から合致する列の値を取得する(戻り値は配列)
  • 配列の要素をTEXTJOIN関数で「,」でくっつけ、セルに入れる
  • このセルを下に事業本部の数だけコピーする

事業本部の数が少なく、あらかじめわかっているような場合はこれでもよいが、処理の前にいちいちユニーク数を確認するのも面倒だし、ユニーク数が膨大な場合は操作ミスもありうる。

そもそも、FILTER関数、TEXTJOIN関数は比較的新しいバージョンで導入された関数なので、古いExcel限定の環境では使えない。

FILTER関数、TEXTJOIN関数なしでこなす方法も探せばあるかもしれないが、ちょっとしんどそうだ。

いずれにしろそこそこ面倒な作業なので、わかっていたとしても、所要時間は20分以上はかかるのではないか。

Power Queryで実行する方法

Power Queryを使う場合は、グループ化した上で「カスタム列を追加」で、M言語で変換する。

生成AIがやり方を教えてくれるので、多少行きつ戻りつはあるが、処理はできる。

こちらも、生成AIと相談しながらで、所要時間は10分〜30分といったところか。

Python

Pythonの場合は、いくらでも情報はみつかると思うので割愛する。

たとえば下記。Pythonで処理する場合は、直接生成AIにやらせた方が早そうだ(ただし、それが正しいかどうかを別途検証する必要がある)。

R言語

Rの場合はとても簡単。これも、生成AIがやってくれると思う(検証が必要なのは前項と同じ)。

data %>% group_by("事業本部") %>% summarise(sumtxt = paste0("部署", collapse = “,”))

Tableau Prep

今回意外だったのは、Tableau Prepでのフローが結構ややこしいこと。詳しくは下記に譲るが、ここまでやるならExcelかPower Queryの方がまだましではないだろうか……。

Exploratory

Exploratoryではどうやるか。Exploratoryには、今回と逆の作業については、見やすいところにメニューが置かれており、手軽に試すことができる。下記の矢印の作業だ。

一つのセルに、同じ「事業本部」に属する「部署名」の値が入っており、これを行方向にコンマでばらしたいとき、分割>…で行に分割>コンマ(,)により、簡単に実行できる。

他のソフトであれば、生成AIの力添えがあったとしても10分くらいはかかる作業が、Exploratoryだと一瞬で終わってしまうのには感動してしまう。

ところがこの逆(今回やりたいこと)をやろうとすると、ちょっとわかりにくい。「分割」の反対だから「統合」というメニューでもあるのかな、と考えてしまうが、ない。