Sorting rows only with name of column
Show older comments
Hi guys, my question is:
I have a table with 5 rows and 10 columns like this:
Datetime Var1 Var2 Var3 Var4 Var5
________________________________________________________
01-01-90 0.025001 0 0.058841 0 0.059898
01-02-90 0.025318 0 0.068993 0 0.067252
01-03-90 0.025318 0 0.074108 0 0.074613
01-04-90 0.025318 0.019803 0.10536 0 0.10008
01-05-90 0.03774 0.020203 0.1372 0 0.16455
......... etc
My question is: How do I sort each row by column name and get a result like this?
Datetime 1 2 3 4 5
___________________________________
01-01-90 Var5 Var3 Var1 Var2 Var4
01-02-90 Var3 Var5 Var1 Var2 Var4
01-03-90 Var5 Var3 Var1 Var2 Var4
01-04-90 Var3 Var5 Var1 Var2 Var4
01-05-90 Var5 Var3 Var1 Var2 Var4
.......... etc
thanks a lot.
Accepted Answer
More Answers (2)
ttmp=[table(datetime(string(Datetime),'InputFormat','MM-dd-yy','PivotYear',1900)) array2table(Var)];
>> [~,ix]=sort(ttmp{:,2:end},2,'descend')
ix =
5 3 1 2 4
3 5 1 2 4
5 3 1 2 4
3 5 1 2 4
5 3 1 2 4
>>
If need the text string, use compose.
ADDENDUM: Specifically...
>> tSortV=[ttmp(:,1) cell2table(ttmp.Properties.VariableNames(ix+1), ...
'VariableNames',compose('%d',1:size(tmp,2)))]
tSortV =
5×6 table
DateTime 1 2 3 4 5
___________ ________ ________ ________ ________ ________
01-Jan-1990 {'Var5'} {'Var3'} {'Var1'} {'Var2'} {'Var4'}
02-Jan-1990 {'Var3'} {'Var5'} {'Var1'} {'Var2'} {'Var4'}
03-Jan-1990 {'Var5'} {'Var3'} {'Var1'} {'Var2'} {'Var4'}
04-Jan-1990 {'Var3'} {'Var5'} {'Var1'} {'Var2'} {'Var4'}
05-Jan-1990 {'Var5'} {'Var3'} {'Var1'} {'Var2'} {'Var4'}
>>
or as strings instead of cellstr()
>> tSortV=[ttmp(:,1) array2table(string(ttmp.Properties.VariableNames(ix+1)),'VariableNames',compose('%d',1:size(tmp,2)))]
tSortV =
5×6 table
DateTime 1 2 3 4 5
___________ ______ ______ ______ ______ ______
01-Jan-1990 "Var5" "Var3" "Var1" "Var2" "Var4"
02-Jan-1990 "Var3" "Var5" "Var1" "Var2" "Var4"
03-Jan-1990 "Var5" "Var3" "Var1" "Var2" "Var4"
04-Jan-1990 "Var3" "Var5" "Var1" "Var2" "Var4"
05-Jan-1990 "Var5" "Var3" "Var1" "Var2" "Var4"
K>>
6 Comments
Well, you've already got them available...
>> ttmp.Properties.VariableNames(ix+1)
ans =
5×5 cell array
{'tmp5'} {'tmp3'} {'tmp1'} {'tmp2'} {'tmp4'}
{'tmp3'} {'tmp5'} {'tmp1'} {'tmp2'} {'tmp4'}
{'tmp5'} {'tmp3'} {'tmp1'} {'tmp2'} {'tmp4'}
{'tmp3'} {'tmp5'} {'tmp1'} {'tmp2'} {'tmp4'}
{'tmp5'} {'tmp3'} {'tmp1'} {'tmp2'} {'tmp4'}
>>
There's no need for any loops at all -- and I showed the form (actually two forms) to build the output table containing the datetime as well in the ADDENDUM to the Answer above -- your choice whether you want cellstr() or string() for the result:
>> [~,ix]=sort(ttmp{:,2:end},2,'descend');
>> tSortV=[ttmp(:,1) cell2table(ttmp.Properties.VariableNames(ix+1), ...
'VariableNames',compose('%d',1:size(tmp,2)))]
tSortV =
5×6 table
DateTime 1 2 3 4 5
___________ ________ ________ ________ ________ ________
01-Jan-1990 {'Var5'} {'Var3'} {'Var1'} {'Var2'} {'Var4'}
02-Jan-1990 {'Var3'} {'Var5'} {'Var1'} {'Var2'} {'Var4'}
03-Jan-1990 {'Var5'} {'Var3'} {'Var1'} {'Var2'} {'Var4'}
04-Jan-1990 {'Var3'} {'Var5'} {'Var1'} {'Var2'} {'Var4'}
05-Jan-1990 {'Var5'} {'Var3'} {'Var1'} {'Var2'} {'Var4'}
>>
is the cellstr version. The string version is:
>> [~,ix]=sort(ttmp{:,2:end},2,'descend');
>> tSortV=[ttmp(:,1) array2table(string(ttmp.Properties.VariableNames(ix+1)),'VariableNames',compose('%d',1:size(tmp,2)))]
tSortV =
5×6 table
DateTime 1 2 3 4 5
___________ ______ ______ ______ ______ ______
01-Jan-1990 "Var5" "Var3" "Var1" "Var2" "Var4"
02-Jan-1990 "Var3" "Var5" "Var1" "Var2" "Var4"
03-Jan-1990 "Var5" "Var3" "Var1" "Var2" "Var4"
04-Jan-1990 "Var3" "Var5" "Var1" "Var2" "Var4"
05-Jan-1990 "Var5" "Var3" "Var1" "Var2" "Var4"
>>
Use your table variable name in place of ttmp that was the local copy here, obviously.
ADDENDUM:
Actually, a third option is to make the variable names a categorical() variable -- if prettyness is the objective in the displayed table, this may be the weiner...
>> [~,ix]=sort(ttmp{:,2:end},2,'descend');
>> tSortV=[ttmp(:,1) array2table(categorical(ttmp.Properties.VariableNames(ix+1)),'VariableNames',compose('%d',1:size(tmp,2)))]
tSortV =
5×6 table
DateTime 1 2 3 4 5
___________ ____ ____ ____ ____ ____
01-Jan-1990 Var5 Var3 Var1 Var2 Var4
02-Jan-1990 Var3 Var5 Var1 Var2 Var4
03-Jan-1990 Var5 Var3 Var1 Var2 Var4
04-Jan-1990 Var3 Var5 Var1 Var2 Var4
05-Jan-1990 Var5 Var3 Var1 Var2 Var4
>>
dpb
on 17 Jun 2020
compose was introduced R2016 but the table variable (and/or row) names being anything other than valid MATLAB variable names wasn't introduced until R2019(not sure of a or b; I saw a note on that once but can't find it at the moment)...
You'll have to have use a variable name beginning with a letter (or upgrade)
Image Analyst
on 12 Jun 2020
Here's one way, perhaps a little easier to understand than dpb's method, though not as compact:
% Setup table.
m = randi(9, 10, 5);
t = array2table(m)
% Now sort each row by columns in descending order:
for row = 1 : size(t, 1)
t{row, :} = sort(t{row, :}, 'descend');
end
% Display result in command window:
t
Categories
Find more on Tables in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!