複数列を単一列にフラット化する

Excel にて、次のような処理をしたい時がある。(列記したが意味は同じである。)

  • 2つ以上の列にわたる範囲を1つの列に変換したい
  • 多次元配列を一次元配列に直したい
  • Google スプレッドシートの FLATTEN 関数に相当する処理を行いたい

このような時は、TOCOL 関数を使う。

=TOCOL(A1:D4)

TOCOL 関数を使わずに INDEX 関数を利用する場合は、次のような数式になる。

=LET(
    area, A1:D4,
    rows, ROWS(area),
    cols, COLUMNS(area),
    total, rows * cols,
    seqArr, SEQUENCE(total),
    rowIndex, INT((seqArr - 1) / cols) + 1,
    colIndex, MOD(seqArr - 1, cols) + 1,
    INDEX(area, rowIndex, colIndex)
)

ちなみに、行列の対角成分だけを抜き出す場合は、次のような数式になる。

=LET(
    area, A1:D4,
    size, ROWS(area),
    seqArr, SEQUENCE(size),
    index, INT((seqArr - 1)) + 1,
    INDEX(area, index, index)
)

INDEX 関数と SEQUENCE 関数を用いた並び替えについては、「INDEX 関数と SEQUENCE 関数を用いた並び替え」という記事に書いた。

以上

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です