Clear Filters
Clear Filters

Sort unique string/number column based on last 2 characters

7 views (last 30 days)
How do I sort a column based on the last 2 characters while maintaining the unique string/number order? I want each group of unique strings/numbers to be reoriganized based on the last 2 characters in this order:
1. ut, fx, os, st, ng (doesn't matter what the order here)
2. ub
3. uu
4. uj
5. nh
Here's parts of the column (it's actually 67x1 cell)
ap12qw_nh
ap12qw_ub
ap12qw_uj
ap12qw_uu
qw54rt_ub
qw54rt_ut
zx23vb_fx
zx23vb_ng
zx23vb_nh
zx23vb_os
zx23vb_st
zx23vb_ub
zx23vb_uj

Accepted Answer

the cyclist
the cyclist on 11 Jun 2020
Edited: the cyclist on 11 Jun 2020
Here is one way:
% The guide to ordering the letter-pairs. (Although the order of the first few letter-pairs
% doesn't matter, it seemed easier to just sort them anyway.)
order_guide = {'ut', 'fx', 'os', 'st', 'ng', 'ub', 'uu', 'uj', 'nh'};
% Input
input = {'ap12qw_nh','ap12qw_ub','ap12qw_uj','ap12qw_uu','zx23vb_fx'}'; % I didn't include them all
% Pull the last two characters of the input
last_two = cellfun(@(x)x(end-1:end),input,'UniformOutput',false);
% Identify which letter-pair the input belongs to, in order
[tf,indexOrder] = ismember(last_two,order_guide);
% Sort the input accordingly
[~,sorting_order] = sort(indexOrder);
sorted_input = input(sorting_order);
  3 Comments
the cyclist
the cyclist on 11 Jun 2020
% Guide to ordering the 2-letter code.
order_guide = {'ut', 'fx', 'os', 'st', 'ng', 'ub', 'uu', 'uj', 'nh'};
% Input
input = {
'qw54rt_ut';
'zx23vb_fx';
'zx23vb_os';
'zx23vb_st';
'zx23vb_ng';
'ap12qw_ub';
'qw54rt_ub';
'zx23vb_ub';
'ap12qw_uu';
'ap12qw_uj';
'zx23vb_uj';
'ap12qw_nh';
'zx23vb_nh'};
% Pull the first six characters of the input, and find the unique ones
first_six = cellfun(@(x)x(1:6),input,'UniformOutput',false);
unique_first_six = unique(first_six);
% Pull the last two characters of the input
last_two = cellfun(@(x)x(end-1:end),input,'UniformOutput',false);
% Identify which 6-letter code the input belongs to, in order
[~,index6] = ismember(first_six,unique_first_six);
% Identify which 2-letter code the input belongs to, in order
[~,index2] = ismember(last_two,order_guide);
% Sort the input, first according to 6-letter code, then according to 2-letter code
[~,sorting_order] = sortrows([index6 index2],[1 2]);
sorted_input = input(sorting_order);
Sole
Sole on 15 Jun 2020
You are a genius! It works! That was a wall I hit. I couldn't figure it out. Thank you so much! The part you lost me at was using the sortrow command to simulataneously sort first 6 and last 2, but now it makes so much sense

Sign in to comment.

More Answers (0)

Categories

Find more on Shifting and Sorting Matrices in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!