I needed to create a 5 year rolling moving average of transposed weekly data. Jerry from SAS tech support came up with what I thought was a great response. He suggested using a multilabel format along with proc summary and the CLASS var / MLF option.
I used a macro loop to create the dynamic proc format statement. The use of the SAS colon (:) wildcard makes it easy to select like named variables such as week1 - week52.
data sample ; do year = 2000 to 2015 ; do weekno = 1 to 52 ; value = int( ranuni( 1 ) * 1000 ) ; output ; end ; end ; run ; proc transpose data = sample out = transposed( drop = _name_ ) prefix = week ; var value ; id weekno ; by year ; run ; %macro yearformat( startyear = 2000 , endyear = 2015 , periods = 5 ) ; %local year ; proc format ; value yearf ( multilabel ) %do year = &startyear. %to %eval( &endyear. - &periods. + 1 ) ; &year - %eval(&year + &periods. -1) = "%eval(&year. + &periods. -1)" %end ; ; run ; %mend ; %yearformat proc summary data = transposed nway ; class year / mlf ; var week: ; format year yearf. week: 8.2 ; output out = movingaverage(drop = _type_ _freq_ ) mean = ; run ;
No comments:
Post a Comment