Вы можете сделать это, используя функции UNIQUE и ACCUMARRAY .Далее предполагается, что в каждой группе будет как минимум 4 элемента.Любые значения NaN
, присутствующие в исходных данных, приведут к значению NaN
для окна суммирования, которое включает это значение:
[~,~,index] = unique(raw(:,1)); %# Get the indices for the unique values
sumFcn = @(x) {sum(hankel([nan(3,1); x(1:numel(x)-3)],... %# Anonymous function
x(numel(x)-3:end)),2)}; %# to get the sum
%# over each window
%# of four values
sumPerID = accumarray(index,raw(:,2),[],sumFcn); %# Compute the windowed sum
%# for each unique ID
raw(:,2) = vertcat(sumPerID{:}) %# Place the results back into the second
%# column of raw
raw =
2001 NaN
2001 NaN
2001 NaN
2001 5000
2001 6000
5555 NaN
5555 NaN
5555 NaN
5555 NaN
5555 55000
5555 75000
7777 NaN
7777 NaN
7777 NaN
7777 NaN