Let's say N=8 and M= 6. If the number of non-missing values within a rolling window is fewer than 6, the program should set the output value to be missing. Not sure if the following does this:
proc expand data = have out = want method = none;
by firm;
id date;
convert x = y/ transformout = (movsum 8 trimleft 5);
run;
I'm not entirely sure here, but I don't think Proc Expand has such an option.
Do you want an alternative to Proc Expand?
@xyxu agree. Proc Expand is so short and smooth 🙂
/*Assuming there is no gap between dates*/
data have;
call streaminit(123);
do firm='A' ,'B' ,'C';
do date='01jan2010'd to '20dec2021'd;
x=rand('uniform');output;
end;
end;
format date date9.;
run;
%let n=8;
%let m=6;
data want;
set have;
by firm;
array t{0:%eval(&n.-1)} _temporary_;
if first.firm then do; n=0; call missing(of t{*});end;
n+1;
t{mod(n,&n.)}=x;
if n ge &n. and n(of t{*}) ge &m. then moving_mean=mean(of t{*});
drop n;
run;
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.