我有一个具有以下结构的数据集:
ID Date&Time var1 var2
1 1/11 1 yes
1 3/11 3 no
1 3/11 2 no
1 5/11 5 yes
1 10/11 2 no
2 3/11 0 yes
2 12/11 1 no
2 23/11 2 yes
2 24/11 0 yes
3 5/11 1 yes
3 6/11 2 no
3 8/11 5 yes
3 9/11 4 no
这是一个带有观察结果的日志文件,我的分析基于该文件。现在,我想考虑一个移动平均线,例如上周(以及月份,年份等)的所有观测值,即我想要的结构如下:
ID Date&Time var1 var2 week_avg week_count
1 1/11 1 yes . .
1 3/11 3 no 1 1
1 3/11 2 no 2 1
1 5/11 5 yes 2 1
1 10/11 2 no 3.33 1
2 3/11 0 yes . .
2 12/11 1 no . .
2 23/11 2 yes . .
2 24/11 0 yes 2 1
3 5/11 1 yes . .
3 6/11 2 no 1 1
3 8/11 5 yes 1.5 1
3 9/11 4 no 2.66 2
是否有一种在lag
循环中使用do-until
函数的方法?
还是PROC EXPAND
能够通过指定时间窗口而不是许多观测值来执行移动平均?
答案 0 :(得分:0)
您可以通过副处理,首先创建相应的期间值:
proc sort data=have ; by id date ; run ;
data periods ;
set have ;
year = put(date,year4.) ;
month = put(date,yymmn6.) ;
week = put(date,weeku5.) ;
run ;
data groups ;
set periods ;
retain week_tot week_cnt month_tot month_cnt year_tot year_cnt 0 ;
/* For the first value in each period, set count & total values to . */
if first.year then call missing(of year_:) ;
if first.month then call missing(of month_:) ;
if first.week then call missing(of week_:) ;
/* Increment count by 1, total by var1, calculate average */
/* Add any conditional logic on which to increment the running values */
week_cnt + 1 ; week_tot + var1 ; week_avg = week_tot / week_cnt ;
month_cnt + 1 ; month_tot + var1 ; month_avg = month_tot / month_cnt ;
year_cnt + 1 ; year_tot + var1 ; year_avg = year_tot / year_cnt ;
run ;
如果愿意,可以将以上内容抽象为宏
%MACRO PERIOD_CALC(PD) ;
retain &PD._cnt &PD._tot ;
if first.&PD then call missing(of &PD._:) ;
&PD._cnt + 1 ;
&PD._tot + var1 ;
&PD._avg = &PD._tot / &PD._cnt ;
%MEND ;
data groups ;
set periods ;
%PERIOD_CALC(week) ;
%PERIOD_CALC(month) ;
%PERIOD_CALC(year) ;
run ;