Sort unique string/number column based on last 2 characters

조회 수: 5 (최근 30일)
Sole
Sole 2020년 6월 11일
댓글: Sole 2020년 6월 15일
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

채택된 답변

the cyclist
the cyclist 2020년 6월 11일
편집: the cyclist 2020년 6월 11일
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
the cyclist
the cyclist 2020년 6월 11일
% 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 2020년 6월 15일
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

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Shifting and Sorting Matrices에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by