Find the first value of each groups.

10 次查看(过去 30 天)
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.

采纳的回答

Raghava S N
Raghava S N 2023-5-24
编辑:Raghava S N 2023-5-24
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 个评论
Smithy
Smithy 2023-5-25
Thank you very much for your answer. I really really really appreciate with it. It works really well now.

请先登录,再进行评论。

更多回答(2 个)

Luca Ferro
Luca Ferro 2023-5-24
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

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

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 MATLAB 的更多信息

标签

产品


版本

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by