Filter löschen
Filter löschen

Find the first value of each groups.

9 Ansichten (letzte 30 Tage)
Smithy
Smithy am 24 Mai 2023
Kommentiert: Smithy am 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.

Akzeptierte Antwort

Raghava S N
Raghava S N am 24 Mai 2023
Bearbeitet: Raghava S N am 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 Kommentar
Smithy
Smithy am 25 Mai 2023
Thank you very much for your answer. I really really really appreciate with it. It works really well now.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Luca Ferro
Luca Ferro am 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 Kommentar
Smithy
Smithy am 25 Mai 2023
Thank you very much for your huge helps. It works for me reall well.

Melden Sie sich an, um zu kommentieren.


Edoardo Mattia Piccio
Edoardo Mattia Piccio am 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 Kommentar
Smithy
Smithy am 25 Mai 2023
Really thank you very much for your helps. It works for me reall well.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Introduction to Installation and Licensing finden Sie in Help Center und File Exchange

Tags

Produkte


Version

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by