Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

xlsxやcsvのデータをExcelで間引く方法(INDIRECT, SUBSTITUTE, ADDRESS, ROW, COLUMN関数)

サンプル数が大きい時系列データや周波数応答が格納されたxlsxやcsvファイルをExcelで開くと、かなり動作が重くなることがあります。

そのようファイルでグラフをプロットのような操作をするのは動作が遅いため苦行ですし、Excelが突然落ちるリスクも高くなります。

基本はプログラムやバッチファイルで間引き(デシメーション)するのがよいですが、どうしてもExcelでなんとかしたい場面があります。

そこで、ファイルサイズの大きい xlsxやcsvのデータをExcelで間引く方法を示します。

元データの形式例

例として、時系列データを考えます。

今回は、rawシートにA列に時系列のインデックス,B-G列に異なる時系列データがあるxlsxを考えます。

このrawシートを編集せず、decimateシートに間引いたデータを作成する方法を実行します。

Excel の数式と関数

decimateシートには、今回はセルi2に間引き係数 N をセットします。

すなわち、decimateシートのデータはrawのデータの 1/Nサンプルになるように間引きを行います。

つまり、N=2であれば行数が半分になります。

間引きの数式は以下のようになります(A2セルに入力する場合)。

=INDIRECT("raw!"& SUBSTITUTE(ADDRESS(ROW(),COLUMN(),4),ROW(),) & ROW(A2)*($I$2)-($I$2-1)*2)

INDIRECTSUBSTITUTEADDRESSROWCOLUMN 関数の使い方については後述の参考文献をご参照ください。

結局のところ、rawシートのデータをN-1サンプルごとに参照しています。

これを行と列方向にドラッグするなどしてオートフィルします。

オートフィルしたセルの数式を確認すると、赤線の部分がセル番号に合わせて変化しています。

なお、数式の $I$2に関する部分を調整することで、間引き係数が格納されたシート/セル番号を変更したり、最初のサンプルをずらす(オフセット変更)などを制御できます。

間引き係数を変えた例

1-fold decimation (間引かない)

3-fold decimation

10-fold decimation

参考文献

blog-tips.sekenkodqx.jp

blog-tips.sekenkodqx.jp

ryukau.github.io