Devide a table in several tables by criteria

4 views (last 30 days)
Guys, Hi again,
I didn't want to use my first thread, because this question is a bit different.
I got a timetable which I want to split in several smaller tables using a criteria from one column in the timetable. If you would plot the time and the column Volt you would get several curves. I want to split the data per curve in a single table.
In the timetable Tdata in the column OnOff I got values only 0 or 1.
1 means current flows, 0 no current. So I want that the script goes through the column OnOff and search for the first 1, copy all the rows until the next 0 comes and write an table. And continue this to the end of the column OnOff.
My question is, is something like this possible? And if yes, could you help me with the loop, somehow I have no idea how to solve it.
Many Thanks!

Accepted Answer

Peter Perkins
Peter Perkins on 19 Jun 2019
Edited: Peter Perkins on 20 Jun 2019
You can do this in several ways, but honestly the most straight-forward is to write a loop, as shown below. The real question is, why do you want to do this? I'm genuinely asking, because there are tools that let you do things like hourly means without splitting the data up. I guess your answer would be, "I want to plot things separately". Fair enough: you can trick rowfun into doing that but it's a little tricky. Are there other things you want to do on the separate timetables?
Anyways, my solution (which could certainly be tightened up but is at least clear):
>> tt = timetable(rand(15,1),[1;1;1;0;0;1;1;1;1;0;1;1;1;1;1], ...
'RowTimes',datetime(2019,6,19,0,0,0:14), ...
'VariableNames',{'X' 'OnOff'});
>> tt.Group = 1 + [0; cumsum(diff([tt.OnOff])~=0)]
tt =
15×3 timetable
Time X OnOff Group
____________________ ________ _____ _____
19-Jun-2019 00:00:00 0.69989 1 1
19-Jun-2019 00:00:01 0.63853 1 1
19-Jun-2019 00:00:02 0.033604 1 1
19-Jun-2019 00:00:03 0.068806 0 2
19-Jun-2019 00:00:04 0.3196 0 2
19-Jun-2019 00:00:05 0.53086 1 3
19-Jun-2019 00:00:06 0.65445 1 3
19-Jun-2019 00:00:07 0.40762 1 3
19-Jun-2019 00:00:08 0.81998 1 3
19-Jun-2019 00:00:09 0.71836 0 4
19-Jun-2019 00:00:10 0.96865 1 5
19-Jun-2019 00:00:11 0.53133 1 5
19-Jun-2019 00:00:12 0.32515 1 5
19-Jun-2019 00:00:13 0.10563 1 5
19-Jun-2019 00:00:14 0.61096 1 5
>> c = cell(numel(unique(tt.Group)),1);
>> for i = 1:length(c), c{i} = tt(tt.Group == i,1:2); end
>> c{:}
ans =
3×2 timetable
Time X OnOff
____________________ ________ _____
19-Jun-2019 00:00:00 0.69989 1
19-Jun-2019 00:00:01 0.63853 1
19-Jun-2019 00:00:02 0.033604 1
ans =
2×2 timetable
Time X OnOff
____________________ ________ _____
19-Jun-2019 00:00:03 0.068806 0
19-Jun-2019 00:00:04 0.3196 0
ans =
4×2 timetable
Time X OnOff
____________________ _______ _____
19-Jun-2019 00:00:05 0.53086 1
19-Jun-2019 00:00:06 0.65445 1
19-Jun-2019 00:00:07 0.40762 1
19-Jun-2019 00:00:08 0.81998 1
ans =
1×2 timetable
Time X OnOff
____________________ _______ _____
19-Jun-2019 00:00:09 0.71836 0
ans =
5×2 timetable
Time X OnOff
____________________ _______ _____
19-Jun-2019 00:00:10 0.96865 1
19-Jun-2019 00:00:11 0.53133 1
19-Jun-2019 00:00:12 0.32515 1
19-Jun-2019 00:00:13 0.10563 1
19-Jun-2019 00:00:14 0.61096 1
  3 Comments
S.M
S.M on 21 Jun 2019
Hi Peter, thank you again for your help. I'll try to adjust it to my needs, thanks a lot.
You guessed it right, I wanted to keep the single curves separated just to plot them a bit easier. But it to me it seems more complicated than I expected :)
S.M
S.M on 1 Jul 2019
Hi Peter, just wanted to say thank you again, everything has worked out really well. Thank you so much!

Sign in to comment.

More Answers (0)

Categories

Find more on Data Type Conversion in Help Center and File Exchange

Products


Release

R2018b

Community Treasure Hunt

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

Start Hunting!