我的数据具有以下结构
data have;
infile datalines delimiter=' ';
input customerid : 8.
date : date9.
opens : 3.
;
datalines;
2123780 11APR2017 0
2123780 13APR2017 0
2123780 16APR2017 1
2123780 18APR2017 0
2123780 19APR2017 2
2123780 20APR2017 0
2123780 21APR2017 0
2123780 23APR2017 0
2123780 25APR2017 0
2123780 26APR2017 0
2123780 28APR2017 0
2123780 29APR2017 3
2123780 01MAY2017 3
2123780 03MAY2017 2
2123780 04MAY2017 5
2123780 05MAY2017 1
2123780 07MAY2017 2
2123780 09MAY2017 2
2123780 11MAY2017 3
2123780 13MAY2017 3
2123780 14MAY2017 0
2123780 16MAY2017 2
2123780 17MAY2017 2
;
run;
我想实现的是opens
变量(以及更多)的移动总数,平均值,标准差等,其中包含落在最后7、14、30等内的值。当前观测值之前的customerid
天。
如您所见,观察结果是不规则的。有时两者之间有很大的差距,有时同一天也有几个。因此,我不能使用PROC EXPAND
(如果我输入错了,请纠正我)。此外,我不想将日期压缩为每周进行一次观察,但保持原样。
我想出的解决方案是一个丑陋的LAG()
编码和if子句。一个7天变量的示例:
%macro loop;
data want(drop= lag_kdnr_num -- lag_mahnung min7 -- min365 minimum);
set have;
week_opens=0;
%do i=1 %to 500;
lag_customerID=lag&i.(customerID);
date_7=lag&i.(date)+7;
lag_opens=lag&i(opens);
if ((customerID=lag_customerID) and (dsate < date_7)) then
do;
week_opens=sum(week_opens + lag_opens);
end;
%end;
min7=minimum + 7;
if date < min7 then
do;
week_opens=.;
end;
run;
%MEND;
%loop;
这给了我这个
data want2;
infile datalines delimiter=' ';
input customerid : 8.
date : date9.
opens : 3.
week_opens : 3.
;
datalines;
2123780 11APR2017 0 .
2123780 13APR2017 0 .
2123780 16APR2017 1 .
2123780 18APR2017 0 1
2123780 19APR2017 2 1
2123780 20APR2017 0 3
2123780 21APR2017 0 3
2123780 23APR2017 0 2
2123780 25APR2017 0 2
2123780 26APR2017 0 0
2123780 28APR2017 0 0
2123780 29APR2017 3 0
2123780 01MAY2017 3 3
2123780 03MAY2017 2 6
2123780 04MAY2017 5 8
2123780 05MAY2017 1 13
2123780 07MAY2017 2 11
2123780 09MAY2017 2 10
2123780 11MAY2017 3 5
2123780 13MAY2017 3 7
2123780 14MAY2017 0 8
2123780 16MAY2017 2 6
2123780 17MAY2017 2 8
;
run;
由于数据量巨大,这确实很慢,并且会创建很多未使用的变量,这些变量最后会被丢弃。 是否有更快,更优雅的方法来获得此结果,例如通过临时阵列还是SAS / ETS? 预先谢谢你!
最后一句话:我想在生存分析中将此信息用作协变量。