複数データの結合方法​について(時系列では​なく距離のデータ)

4 views (last 30 days)
Kog
Kog on 12 Jun 2019
Commented: Kazuya on 14 Jun 2019
時系列データと似ているのですが
時間ではなくDistance(m)を基準に、複数のデータを統合したいと考えています。
下記のURLと同様のことを行う方法がないでしょうか。

Answers (4)

Kazuya
Kazuya on 12 Jun 2019
outerjoin 関数でおっしゃるような結合はできますが、「±5分であれば同じ時刻とみなす」というのが少しややこしいので1発でできる関数はなさそうです。事前に retime 関数で時間情報を合わせておいて、outerjoin 関数というのが現実的かと思います。
  1 Comment
Kazuya
Kazuya on 12 Jun 2019
すいません、、質問をよく読んでいませんでした。「時間ではなく距離(m)」を基準に結合するんですね。±5mであれば同じとみなす、、といった状況ですか?
ismembertol 関数(https://jp.mathworks.com/help/matlab/ref/ismembertol.html)辺りが使えそうな気がしますね。もしサンプル or ダミーデータがあれば簡単なコード作ってみますよ。

Sign in to comment.


Kog
Kog on 12 Jun 2019
>「時間ではなく距離(m)」を基準に結合
その通りなのです。こちらサンプルデータなのですが。
プラスマイナス0.1mのようなデータが作りたいという状況です。
ismembertol(使ったことないのですみません)してからouterjoinということでしょうか。
こちらサンプルデータになります。お手数おかけします…
m A
54.5708 8.745625
54.7232 8.724561
54.8756 8.663745
55.0280 8.657503
55.1804 8.755301
55.3328 9.075251
55.4852 8.821213
55.6376 8.895787
55.7900 8.731291
55.9424 8.749257
m B
54.5707 94.44037
54.6012 93.90342
54.6317 93.3698
54.6622 92.83287
54.6926 92.29925
54.7231 91.76232
54.7536 90.61997
54.7841 89.46606
54.8146 88.3233
54.8450 87.16941
54.8755 86.01798
54.9060 85.29588
54.9365 84.56671
54.9670 83.8446
54.9974 83.11544
55.0279 82.39332
55.0584 82.46228
55.0889 82.53472
55.1194 82.60761
55.1498 82.68005
55.1803 82.75294
55.2108 82.96026
55.2413 83.16669
55.2718 83.37442
m C D E F
55.4852 32.6553 5.632744 38.0176 8.447569
55.6376 29.7773 6.321755 35.6637 9.20627
55.7900 28.9169 6.652872 35.0042 9.409002
55.9424 29.6418 5.780853 35.3463 8.483777
56.0948 30.0847 4.23621 35.1083 8.706783
56.2472 30.1985 3.076636 34.6184 8.519116
56.3996 30.3919 2.28779 34.2993 8.486839
56.5520 30.4901 1.260233 33.5339 8.046391

Kog
Kog on 13 Jun 2019
プラスマイナス0.01mでした

Kazuya
Kazuya on 13 Jun 2019
さてサンプルコード作ってみましたので、実行して確かめてみてください。もっときれいなやり方があるとは思いますが参考になりましたら幸いです。各関数のオプション設定など??な部分も多いかと思いますが、できればドキュメンテーションページを読み込みながら悩んでみてください。何かあれば新しい回答としではなく「この回答についてコメント」のボタンからコメントくださいませ。
%%
% サンプルデータ(|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)
  2 Comments
Kog
Kog on 14 Jun 2019
サンプルコードまで作っていただいてありがとうございます!
こちら、roundで丸めることを考えていたのですがisemembertolでは誤差範囲を指定しているのですね。
こちらのほうが本来の目的に近く、便利そうです!
ありがとうございます!かなり使わせていただきます!
Kazuya
Kazuya on 14 Jun 2019
お役に立ちましたら嬉しいです :)

Sign in to comment.

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!