Sort all columns in a cell array with labels

4 Ansichten (letzte 30 Tage)
Suha
Suha am 13 Feb. 2018
Kommentiert: Suha am 14 Feb. 2018
Hello everyone
I have the following cell array with text and numeric data:
>> M
M =
5×4 cell array
'' 'Ana' 'Delta' 'Oscar'
'B' [0.9058] [0.9058] [0.9058]
'C' [0.1270] [0.1270] [0.1270]
'D' [0.9134] [ 4] [ 2]
'E' [0.6324] [0.6324] [0.6324]
I would like to sort the data in columns 2, 3 and 4 in descending order (largest to smallest) but also with labels (column 1) and also with labels Ana, Delta and Oscar. I am aware that sortrows can be used for sorting data using a particular column, but I am not sure of the indexing for sortrows or an efficient way of sorting data in columns 2-4 in my cell array M and at the same time having labels next to them.
Thank you for your help.
Suha.
  2 Kommentare
Stephen23
Stephen23 am 13 Feb. 2018
Bearbeitet: Stephen23 am 13 Feb. 2018
@Suha: you should really consider putting your data into a table, which natively store data with headers. Then you could apply lots of other functions to the data without having to worry about the first row and column being special cases, e.g. sorting the rows without requiring any indexing at all. It also stores the columns as arrays of an appropriate class, which makes working with the data much easier (putting lots of scalar numeric data into cells of a cell array just makes working with numeric data much more complex than it needs to be).
Suha
Suha am 13 Feb. 2018
I turned the cell array into a table using cell2table, but then got stuck trying to sort the data...

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Stephen23
Stephen23 am 13 Feb. 2018
Bearbeitet: Stephen23 am 13 Feb. 2018
If you do not want to use a table then you would be better off keeping your numeric and cell-of-character data separately, e.g.:
hdr = {'Ana','Delta','Oscar'}
typ = {'B','C','D','E'};
mat = [0.9058,0.9058,0.9058;...
0.1270,0.1270,0.1270;...
0.9134, 4, 2;...
0.6324,0.6324,0.6324];
Then you can trivially sort by rows as you choose:
>> [mat,idx] = sortrows(mat)
mat =
0.12700 0.12700 0.12700
0.63240 0.63240 0.63240
0.90580 0.90580 0.90580
0.91340 4.00000 2.00000
idx =
1
2
3
4
>> typ = typ(idx);
>> typ{:}
ans = B
ans = C
ans = D
ans = E
  5 Kommentare
Stephen23
Stephen23 am 13 Feb. 2018
@Suha: each column might have a different order: is that what you want?
>> [mat,idx] = sort(mat,1)
mat =
0.12700 0.12700 0.12700
0.63240 0.63240 0.63240
0.90580 0.90580 0.90580
0.91340 4.00000 2.00000
idx =
2 2 2
4 4 4
1 1 1
3 3 3
>> out = typ(idx)
'C' 'C' 'C'
'E' 'E' 'E'
'B' 'B' 'B'
'D' 'D' 'D'
Suha
Suha am 14 Feb. 2018
@Suha: each column might have a different order: is that what you want?
Yes, that's exactly what I want ! Thank you. It works :)

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Birdman
Birdman am 13 Feb. 2018
Bearbeitet: Birdman am 13 Feb. 2018
Something like this?
[~,idx]=sort(cell2mat(M(2:end,2:end)),1,'descend');
M(sort(idx)+1,:)=M(idx+1,:)
or
[~,idx]=sortrows(M(2:end,2:end),'descend');
M(sort(idx)+1,:)=M(idx+1,:)
  7 Kommentare
Birdman
Birdman am 13 Feb. 2018
It worked perfectly in my case, where each column was sorted independently. Make sure you enter the code correctly, otherwise it should work. I can not attach a screenshot of it at the moment.
Suha
Suha am 14 Feb. 2018
Thank you for your help ! :)

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Shifting and Sorting Matrices finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by