我有一个数据集,我想计算SAS中每个id的多个福利法术的持续时间。
开始由变量y_xxxx定义,其值为'福利',其中前4 y_xxxx不等于'福利'对于每个id。
结束由变量y_xxxx定义,其值为'福利',其中以下4 y_xxxx不等于'福利'。如果以下4个y_xxxx带有值'其他'这个法术必须删除而不是整个观察。
持续时间 =结束 - 开始+ 1
每个id都可以有多个'福利'法术,满足上述限制。数据看起来像这样(除了在真实数据集中记录变量y_xxxx直到y_1548)。
ID y_0950 y_0951 y_0952 y_0953 y_1001 y_1002 y_1003 ... y_1015
01 other other other other welfare welfare welfare ...
02 welfare welfare welfare other other other other ...
03
04
...
N other other other other welfare welfare welfare ...
我可以计算第一个法术的持续时间,请参阅下面的代码,但我无法弄清楚如何继续为每个id继续下一个法术,而不会一遍又一遍地重复相同的代码。
%let uger=y_0950--y_1015;
%let welfare='welfare';
%let other='other';
/*Start welfare spell*/
data mydata;
set data;
array y(*) &uger;
do j=5 to 19 until (start);
if y(j-1) ne &welfare and
y(j-2) ne &welfare and
y(j-3) ne &welfare and
y(j-4) ne &welfare and
y(j) eq &welfare
then start=j;
end;
if start>0 then output;
run;
/*end welfare spell*/
data mydata1;
set mydata;
array y(*) &uger;
do j=start to 19 until(ends);
if y(j) ne &welfare and
y(j+1) ne &welfare and
y(j+2) ne &welfare and
y(j+3) ne &welfare
then ends=j-1;
end;
/*other*/
do k=start to 19 until(other);
if y(k) eq &other and
y(k+1) eq &other and
y(k+2) eq &other and
y(k+3) eq &other
then other=k-1;
end;
if ends=. then censor=1;
if ends=. then ends=19;
if other >0 then delete;
duration= ends-start+1;
run;
我想最终得到如下数据(不对应于上面的数据示例)
ID start end duration censor
01 5 10 6 0
01 15 19 5 1
02 6 12 7 0
03 ..
04 ..
04 ..
..
N
答案 0 :(得分:0)
假设censor
表示上次观察到的时期是“福利”,这应该可以解决您的问题。
这个问题有多个解决方案,但关键是当你在值“福利”之后达到“其他”值时使用output
,并将其他变量重置为缺失(可以<{1}}后,你已经开始0了,所以你可以重新开始。
要注意的另一件事是向量中最后一个元素的特殊性。请参阅下面的代码中的我的评论。
output
data welfare;
input ID
y_0950 $
y_0951 $
y_0952 $
y_0953 $
y_1001 $
y_1002 $
y_1003 $;
datalines;
01 other welfare welfare other other welfare welfare welfare
02 welfare welfare welfare other other other other
03 welfare welfare other other welfare welfare welfare
04 welfare other welfare welfare other welfare other
run;