Azzera filtri
Azzera filtri

Find the first value of each groups.

9 visualizzazioni (ultimi 30 giorni)
Smithy
Smithy il 24 Mag 2023
Commentato: Smithy il 25 Mag 2023
Hello everybody,
I would like to find the first value of each groups. Is there a way to find the each group's first value?
the expecting answer is [1 5 2 1] in this case.
I tried with
GroupFirst1 = arrayfun(@(k) result(find(result(ic==k), 1, 'first')),1:length(GroupId))';
but it doest not work. Could anyone give me some helps?
x = [3 3 3 4 4 5 5 5 5 3 11]';
y = [1 2 4 5 7 2 1 8 10 10 1]';
result = [x,y];
[GroupId,~,ic] = unique(result(:,1));
% Calculating the averages of different groups of values
GroupMean1 = arrayfun(@(k) mean(result(ic==k,2)),1:length(GroupId))';
% How to find the first y value of according to x
% I need to get 1st value of Ys, corresponds to similar groups of Xs separately.
% first y value when x = 3 is.. 1, and first y value when x = 4 is.. 5, and
% first y value when x = 5 is.. 2, and first y value when x = 11 is.. 1.
% so the expecting answer is [1 5 2 1]
% GroupFirst1 = arrayfun(@(k) result(find(result(ic==k), 1, 'first')),1:length(GroupId))'; % it doest not work.

Risposta accettata

Raghava S N
Raghava S N il 24 Mag 2023
Modificato: Raghava S N il 24 Mag 2023
x = [3 3 3 4 4 5 5 5 5 3 11]';
y = [1 2 4 5 7 2 1 8 10 10 1]';
result = [x,y];
[GroupId,~,ic] = unique(result(:,1));
GroupFirst1 = arrayfun(@(k) result(find(result(:,1)==GroupId(k),1),2),1:length(GroupId))'
GroupFirst1 = 4×1
1 5 2 1
This should work. I think you made the mistake of not searching for the 'GroupId's, but their indices with result(ic==k).
  1 Commento
Smithy
Smithy il 25 Mag 2023
Thank you very much for your answer. I really really really appreciate with it. It works really well now.

Accedi per commentare.

Più risposte (2)

Luca Ferro
Luca Ferro il 24 Mag 2023
It's not the most efficient way since it uses loops and find instead of indexing but this works:
x = [3 3 3 4 4 5 5 5 5 3 11]';
y = [1 2 4 5 7 2 1 8 10 10 1]';
result = [x,y];
[GroupId,~,ic] = unique(result(:,1));
for gg=1:size(GroupId,1)
allCorr=find(x==GroupId(gg));
firstCorr(gg)=y(allCorr(1));
end
firstCorr
firstCorr = 1×4
1 5 2 1
  1 Commento
Smithy
Smithy il 25 Mag 2023
Thank you very much for your huge helps. It works for me reall well.

Accedi per commentare.


Edoardo Mattia Piccio
Edoardo Mattia Piccio il 24 Mag 2023
Hi Smithy, here there is an attempt to solve your problem. I hope it will be all clear, this is my first answer here
x = [3 3 3 4 4 5 5 5 5 3 11]';
y = [1 2 4 5 7 2 1 8 10 10 1]';
[newX,idx]= sort(x,'ascend'); % Sort x so the equal numbers are consecutive
newY= y(idx); % sort y in the same way of x
idx2= [1; diff(newX)~=0];% with diff(newX) I find when the number changes; adding 1 as first element, to taking account the first group of equal numbers
temp= newY.*idx2; % take only the numbers of y that corresponds to the first value of x
GroupFirst1= temp(temp>0);
  1 Commento
Smithy
Smithy il 25 Mag 2023
Really thank you very much for your helps. It works for me reall well.

Accedi per commentare.

Categorie

Scopri di più su Introduction to Installation and Licensing in Help Center e File Exchange

Tag

Prodotti


Release

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by