質問: 時系列データから条件抽出し、カウントや累積和を出す方法 以下のような時系列データから、2列目の前後indexを比較し、条件によってtrue,false判定し、 その値に応じてカウントアップをさせたいのですが、なにか良い方法はありませんでしょうか? イメージは以下のようなデータ1,2列のデータがあり、3~5列のようなデータを付与したいです。 1 index前後によって比較する方法(上記2列目のroomtempデータから、3列目のような列を作成する方法) for loopやcircshiftなどを使って、配列をずらし、条件比較し算出する方法は浮かぶのですが、なにかもっと良い別の手法があればご教授いただきたく。 2 他の列の条件によってカウントアップする方法(上記3や4列目のデータから、4や5列目のカウントアップや累積和を作成する方法) 他列の条件により、累積和を出す方法でできると思うのですが、条件により累積和をリセットする方法がわかりません。 カウント自体は条件によって異なるので、常にindex数が同じとは限らないので、forloopで特定数で回すこともできません。 上記12について、何か良い方法が無いかアドバイスいただきたく、よろしくお願いいたします。
回答: 1 index前後によって比較する方法:データ内容から「局所的ピークを検出」していると判断しました 局所的最大値 - matlab findpeaks - mathworks 日本:3列目のピーク判定にはfindpeaks関数が最も適します。 局所的最大値を検出 - matlab islocalmax - mathworks 日本:3列目のピーク判定にはislocalmax/min関数も適します。 参考:find peaks in an fft without signal processing toolbox - matlab answers - matlab central (mathworks.com) 2 他の列の条件によってカウントアップする方法 連長圧縮 - wikipedia:4列目のカウントアップは連長圧縮の応用です。専用のmatlab関数は無いと思いますが関連記事は多数あります。工夫してfor文を無くす事も可能ですがトリッキーなので、普通にfor文でリセットするのが無難だと思います。同様の問題がcodyにもあります。make a run-length companion vector - matlab cody - matlab central (mathworks.com) 累積和 - matlab cumsum - mathworks 日本:5列目の累積和にはcumsum関数が適しています。 timestamps = repelem(datetime(2021,7,17,0:8,1,3),2)'; timestamps(2:2:end).minute = timestamps(2:2:end).minute + 30; % 1列目の時刻 roomtemp = [25.9467 26.0536 26.191 26.3284 26.0325 26.5575 26.6185 26.6287... 26.153 26.6287 26.6385 26.712 26.835 26.315 26.5982 26.7203 26.7814 26.9]'; % 2列目の室温データ var5 = islocalmin(roomtemp) + 0; % 3列目のピーク判定(0加算はlogical→double値変換の為) var3 = 0; % 4列目のカウントアップ(ここから) for k = ~var5' % ピーク判定の反転値(ピーク時に0⇒カウントリセット) var3 = [var3; k*var3(end)+1]; end var3 = var3(2:end); % 4列目のカウントアップ(ここまで)最後に先頭に付けた0を除く var4 = cumsum(var5);% 5列目の累積和 mytable = table(timestamps, roomtemp, var5, var3, var4)