複数データの結合方法について(時系列ではなく距離のデータ)
4 次查看(过去 30 天)
显示 更早的评论
時系列データと似ているのですが
時間ではなくDistance(m)を基準に、複数のデータを統合したいと考えています。
下記のURLと同様のことを行う方法がないでしょうか。
0 个评论
回答(4 个)
Kazuya
2019-6-12
outerjoin 関数でおっしゃるような結合はできますが、「±5分であれば同じ時刻とみなす」というのが少しややこしいので1発でできる関数はなさそうです。事前に retime 関数で時間情報を合わせておいて、outerjoin 関数というのが現実的かと思います。
1 个评论
Kazuya
2019-6-12
すいません、、質問をよく読んでいませんでした。「時間ではなく距離(m)」を基準に結合するんですね。±5mであれば同じとみなす、、といった状況ですか?
ismembertol 関数(https://jp.mathworks.com/help/matlab/ref/ismembertol.html)辺りが使えそうな気がしますね。もしサンプル or ダミーデータがあれば簡単なコード作ってみますよ。
Kazuya
2019-6-13
さてサンプルコード作ってみましたので、実行して確かめてみてください。もっときれいなやり方があるとは思いますが参考になりましたら幸いです。各関数のオプション設定など??な部分も多いかと思いますが、できればドキュメンテーションページを読み込みながら悩んでみてください。何かあれば新しい回答としではなく「この回答についてコメント」のボタンからコメントくださいませ。
%%
% サンプルデータ(|table|型)作成(注:わかりやすい結果になるようデータは変更しています)
tmp = [
55.33 9.07
55.48 8.82
55.64 8.89
55.78 8.73
55.94 8.74];
data1 = array2table(tmp,'VariableNames',{'m','A'});
tmp = [55.48 32.6 5.6
55.63 29.7 6.3
55.79 28.9 6.6
55.94 29.6 5.7
56.09 30.0 4.2];
data2 = array2table(tmp,'VariableNames',{'m','C','D'});
%%
% 変数 |m |をベースに |data1, data2|の各変数(|A,C,D,E,F|) を結合してみます。
%
% まずは何も考えずに outerjoin 関数で結合。
merged1 = outerjoin(data1,data2,'Keys','m','MergeKeys',true)
%%
% 次に ±0.01 m の際は同じ値と見なす実装にしてみます。
% まずは ismembertol 関数で 0.01 以内の差で一致する行を抽出します。
tol = 0.01;
[idxdata2,locdata1] = ismembertol(data2.m,data1.m,tol,'DataScale',1);
%%
% data2.m の要素が data1.m の要素の許容誤差内にある場合に logical |1| (|true|) を含む配列 idxdata2 となっているはず。data2.m
% の値を 0.01 以内で一致した data1.m の値に書き換え。'DataScale',1 オプション無しで実行すると、
% 「相対誤差」が 0.01 (1%) 以内は一致という処理になってしまう点に注意。
% 'DataScale',1 オプションを加えると「絶対誤差」で判断します。
% この辺は ismembertol 関数のドキュメンテーションページに記載があります。
data2.m(idxdata2) = data1.m(locdata1(idxdata2));
%%
% 満を持して結合。m=55.64, 55.63 及び m=55.78,55.79 が同一とみなされている点に注目。
merged2 = outerjoin(data1,data2,'Keys','m','MergeKeys',true)
另请参阅
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!