Sorting data from table

10 views (last 30 days)
Jiri Soucek
Jiri Soucek on 15 Oct 2018
Edited: Andrei Bobrov on 18 Oct 2018
Hi, I have a table T (8766x4) columns are - month, day, year and Flow rate (that is 24 years of data - 8766 days). I need to sort flow rate for each year separately and descend flow rate for each year and then plot.
P.S. I am afraid this approach with tables is wrong

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 15 Oct 2018
Edited: Andrei Bobrov on 18 Oct 2018
T - your table with variables: month, day, year and prutok.
ii = findgroups(T.year);
Prutok = accumarray(ii,T.prutok,[],@(x){sort(x,'descend')});
for jj = 1:numel(Prutok), plot(Prutok{jj}); hold on; end
other variant
Days1 = day(datetime(T{:,{'year','month','day'}}),'dayofyear');
c = findgroups(T.year);
Anew = sort(accumarray([Days1,c],T.prutok,[],[],nan),'descend');
plot(Anew)
(added)
and the best variant by Guillaume and Peter
hold on
varfun(@(x)plot(sort(x,'descend')),T,'GroupingVariable','year','InputVariable','prutok');
hold off
  2 Comments
Guillaume
Guillaume on 15 Oct 2018
Assuming that's what is wanted, this is probably simpler:
varfun(@(col) plot(sort(col, 'descend'), T, 'GroupingVariables', 'year', 'InputVariables', 'prutok')
Jiri Soucek
Jiri Soucek on 16 Oct 2018
Andrei Bobrov Thanks a lot :)

Sign in to comment.

More Answers (1)

Guillaume
Guillaume on 15 Oct 2018
Simple:
sortedtable = sortrows(yourtable, 'year', 'flowrate', {'ascend', 'descend'}) %sort ascending by year, and for identical year, descending by flow rate
where 'year' and 'flowrate' are the variable names of your year and flow rate column respectively.
A table is the right approach.
  2 Comments
Jiri Soucek
Jiri Soucek on 15 Oct 2018
:( It doesnt work (it says that variable 'year' its class is 'double' and more if it would/will work i need to plot it to get this
I allready manage to plot the values by this method:
r=1994; while r<=2017
r=r+1;
Q_rocni2=T.prutok(T.year==r);
Q_rocni2_sort=sort(Q_rocni2,'descend'); %seřazen průtok za 1 rok
plot(Q_rocni2_sort,'b'); hold on
but I would like to have values in table/matrix, where rows are flowrates and one column is one year for example. Because I nee to work with values furthemore
Thanks
Peter Perkins
Peter Perkins on 17 Oct 2018
I think something like Guillaume's is the right way to go: sort the data by time, then make a plot for each year. From the plot you made, it seems like your original description is not accurate -- it looks to me like you want to plot flow rate by time, overlaying each year.
So: sortrows using year/month/day, then use varfun to make the plots (with hold on/of before and after).

Sign in to comment.

Tags

Community Treasure Hunt

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

Start Hunting!