# Grouping rows on the first column and obtain minimum value on second column

2 views (last 30 days)
H_W on 3 Aug 2022
Edited: Adam Danz on 4 Aug 2022
I have the following matrix A and would like to group it on the first column
A = [13 7
13 6
13 5
13 6
12 7
12 5];
and then obtain minimum value on second column to obtain matrix B
B = [13 5
12 5];
Could anyone give a hint?
Thanks!

Torsten on 3 Aug 2022
Edited: Torsten on 3 Aug 2022
What do you mean by "group on the first column" ?
A = [13 7
13 6
13 5
13 6
12 7
12 5];
A = sortrows(A,2,'ascend');
B = A(1:nnz(A(:,2)==A(1,2)),:)
B = 2×2
13 5 12 5
Torsten on 3 Aug 2022
So for all distinct values in the first column, you want to get one pair where the value in the second column is minimum ? Is it necessary to group the first column first (e.g. sort in ascending/descending order) or is this already done in A ?
Adam Danz on 3 Aug 2022
Edited: Adam Danz on 4 Aug 2022
If I'm understanding correctly, that's what the solutions do in my answer.

Adam Danz on 3 Aug 2022
Edited: Adam Danz on 3 Aug 2022
A = [13 7
13 6
13 5
13 6
12 7
12 5];
B = groupsummary(A,A(:,1),'min')
B = 2×2
12 5 13 5
Note that rows are sorted according to the grouping column values.
To keep the row order stable there are several options but I lean on arrayfun which is less readable than other options.
B = cell2mat(arrayfun(@(g){min(A(A(:,1)==g,:))}, unique(A(:,1),'stable')))
B = 2×2
13 5 12 5