Find the first value of each groups.

10 vues (au cours des 30 derniers jours)
Smithy le 24 Mai 2023
Commenté : Smithy le 25 Mai 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.
0 commentairesAfficher -2 commentaires plus anciensMasquer -2 commentaires plus anciens

Connectez-vous pour commenter.

Réponse acceptée

Raghava S N le 24 Mai 2023
Modifié(e) : Raghava S N le 24 Mai 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 commentaireAfficher -1 commentaires plus anciensMasquer -1 commentaires plus anciens
Smithy le 25 Mai 2023
Thank you very much for your answer. I really really really appreciate with it. It works really well now.

Connectez-vous pour commenter.

Plus de réponses (2)

Luca Ferro le 24 Mai 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 commentaireAfficher -1 commentaires plus anciensMasquer -1 commentaires plus anciens
Smithy le 25 Mai 2023
Thank you very much for your huge helps. It works for me reall well.

Connectez-vous pour commenter.

Edoardo Mattia Piccio le 24 Mai 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 commentaireAfficher -1 commentaires plus anciensMasquer -1 commentaires plus anciens
Smithy le 25 Mai 2023
Really thank you very much for your helps. It works for me reall well.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Introduction to Installation and Licensing dans Help Center et File Exchange

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by