Sorting rows only with name of column
Afficher commentaires plus anciens
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.
Réponse acceptée
Plus de réponses (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 commentaires
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
le 17 Juin 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
le 12 Juin 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
Catégories
En savoir plus sur Tables dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!