grouping data based on the times a value is repeated

2 views (last 30 days)
I have data in array form with big number of rows and 12 columns. One of the column has an increasing array but not in a stable way (e.g. 1 1 1 1 1 2 2 2 2 3 3 4 4 4 4 4 4 4 4 5 6 6 6 etc)I want to organize data so I have all rows with 1 repetition of the value, 2 repetitions and so forth without disrupting the order of the sequence between each number. So I want to have an array that in the beginning was like this:
[1 45 67]
[1 23 89]
[1 90 110]
[2 41 52]
[2 51 76]
[2 77 88]
[2 13 14]
[3 545 111]
[3 242 53]
[3 80 23]
[4 11 22]
[4 14 26]
[4 16 77]
[4 11 943]
and I want it to be like that:
[1 45 67]
[1 23 89]
[1 90 110]
[3 545 111]
[3 242 53]
[3 80 23]
and
[2 41 52]
[2 51 76]
[2 77 88]
[2 13 14]
[4 11 22]
[4 14 26]
[4 16 77]
[4 11 943].
The data is all numerical and all rows have values in all columns.
Is there a way to do this with MATLAB?
Thank you very much.

Accepted Answer

Guillaume
Guillaume on 28 Feb 2018
m = [1 45 67; 1 23 89; 1 90 110; 2 41 52; 2 51 76; 2 77 88; 2 13 14; 3 545 111; 3 242 53; 3 80 23; 4 11 22; 4 14 26; 4 16 77; 4 11 943]
numreps = diff(find(diff([0;m(:, 1);0]))); %or use any histogram function
[~, neworder] = sort(numreps);
splitm = mat2cell(m, numreps, size(m, 2));
reorderedm = cell2mat(splitm(neworder))
Other ways of obtaining numreps:
numreps = accumarray(m(:, 1), 1); %only if m(:, 1) is integer from 1 to x with no gap.
numreps = histcounts(m(:, 1), 'BinMethod', 'integers'); %only if m(:, 1) is integer from 1 to x with no gap.
numreps = histcounts(m(:, 1), [unique(m(:, 1)); Inf]);
  3 Comments
Guillaume
Guillaume on 5 Mar 2018
If I understand correctly what you're asking, replace the 2nd line with
[sortedreps, neworder] = sort(numreps);
to find the length of each run
runlength = diff(find(diff([0; sortedreps; 0])))

Sign in to comment.

More Answers (2)

Image Analyst
Image Analyst on 28 Feb 2018
Have you tried taking the histogram of the first column?
  5 Comments
Image Analyst
Image Analyst on 5 Mar 2018
Edited: Image Analyst on 5 Mar 2018
You must have a really old version of MATLAB. You can use hist() or histc() instead.
Guillaume
Guillaume on 5 Mar 2018
In my answer, under "Other ways of obtaining numreps", I showed two different ways of using histcounts. Because of the automatic binning you can't just pass the column of number.

Sign in to comment.


Georgios Tertikas
Georgios Tertikas on 5 Mar 2018
i meant it works but it doesnt show the results i need

Community Treasure Hunt

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

Start Hunting!