グループごとにretimeを適用する

1 view (last 30 days)
涼輔 前田
涼輔 前田 on 28 Nov 2021
Edited: 涼輔 前田 on 5 Dec 2021
日付とグループ番号が記載された2列のtimetableがあります。日付は2019/4~2020/3のもので、グループごとに欠損している日付が異なります。グループごとに欠損した日付をretimeで埋める方法はないでしょうか。
  3 Comments
涼輔 前田
涼輔 前田 on 30 Nov 2021
上のようなTというデータがあり、groupがグループ番号を示しています。
datacountが0の部分の日付はデータの中に入っておらず、全てのグループ番号に対して2019.4.1~2020.3.31の欠損している日付を埋めたいと考えています。

Sign in to comment.

Accepted Answer

Kojiro Saito
Kojiro Saito on 30 Nov 2021
Edited: Kojiro Saito on 30 Nov 2021
【編集後】
いただいたコメントでやりたいことが理解できました。
グループ番号毎にtimeが2019/4/1~2020/3/31で、datacountが0の配列(下記のコードでnewTで定義したもの)を作り、変数Tに含まれている日付とグループ番号の場合はTのdatacountを代入する方法です。
下記のコードで実現できると思います。
[g, groupId] = findgroups(T.group);
timeRange = datetime(2019,4,1):days(1):datetime(2020,3,31); % 2019/4/1~2020/3/31の1日毎の要素
% グループ番号毎にtimeが2019/4/1~2020/3/31で、datacountが0のテーブル
newT = table;
newT.time = repmat(timeRange, [1, length(groupId)])';
newT.datacount(:) = 0;
newT.group(:) = sortrows(repmat(groupId', [1, length(timeRange)])');
% 変数Tに含まれている日付とグループ番号の場合は、Tのdatacountを代入
for n=1:height(T)
idx = (T.time(n) == newT.time) & (T.group(n) == newT.group);
newT.datacount(idx) = T.datacount(n);
end
実行してnewTに所望のデータが格納されると思います。
【編集前】
変数Tにtimeとgroupがソートされた状態で格納されているようですので、グループ毎に処理させずにテーブルの全行について、time列で日付が欠損してNaTになっている部分をfillmissingで埋める方法でどうでしょうか。
T.time = fillmissing(T.time, 'nearest');
  5 Comments
涼輔 前田
涼輔 前田 on 4 Dec 2021
Edited: 涼輔 前田 on 5 Dec 2021
ありがとうございます。
Tが膨大な行のデータの場合、処理中から計算が終了しないのですが解決策はあるでしょうか。
よろしくお願いいたします。

Sign in to comment.

More Answers (0)

Tags

Products

Community Treasure Hunt

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

Start Hunting!