我需要创建一些新变量day1
day2
day3
等。如果readmit=1
那么day[i]
每个day[i]=gap
例如,第一个两个重新接受应该得到day[1]=21
day[2]=9
。然后是下一个readmit=1
,对于第三个重新接受,第四个重新接受,第五个readmit=1
应该得到结果day[1]=29
day[2]=12
day[3]=23
,依此类推。希望我表达得很好。提前谢谢。
STUDYID index readmit gap
10001 1 0
10001 1 0 79
10001 1 0 48
10001 1 0 39
10001 1 0 74
10001 1 0 41
10001 0 1 21
10001 0 1 9
10001 0 0 130
10001 0 0 52
10001 0 0 110
10001 1 0 80
10001 0 1 29
10001 0 1 12
10001 0 1 23
10001 1 0 57
10001 0 1 28
10001 0 1 14
10001 1 0 118
10001 0 1 5
10001 0 1 22
10001 1 0 40
10001 0 1 23
10001 0 1 24
10001 0 1 19
答案 0 :(得分:1)
我认为以下代码可以回答您的问题。这需要2次传递数据,第一次计算READMIT = 1的最大连续行数,它存储在用于确定第二次传递中的数组大小的宏变量中。
解决这个问题的关键是数据的顺序和BY语句中NOTSORTED选项的使用。这样可以将READMIT值的每个更改都视为新部分。
希望这会有所帮助,尽管如果有人能找到一种只使用一次数据传递的方法会很好。
data have;
input STUDYID index readmit gap;
cards;
10001 1 0 .
10001 1 0 79
10001 1 0 48
10001 1 0 39
10001 1 0 74
10001 1 0 41
10001 0 1 21
10001 0 1 9
10001 0 0 130
10001 0 0 52
10001 0 0 110
10001 1 0 80
10001 0 1 29
10001 0 1 12
10001 0 1 23
10001 1 0 57
10001 0 1 28
10001 0 1 14
10001 1 0 118
10001 0 1 5
10001 0 1 22
10001 1 0 40
10001 0 1 23
10001 0 1 24
10001 0 1 19
;
run;
data _null_;
set have (keep=readmit) end=last;
by readmit notsorted;
if first.readmit then days=0;
retain max_days;
if readmit=1 then days+1;
max_days=max(max_days,days);
if last then call symput('max_days',strip(max_days));
run;
%put maximum consecutive days = &max_days.;
data want;
set have;
by readmit notsorted;
array dayvar{*} day1-day&max_days.;
if first.readmit then do;
num_day=0;
call missing(of day:);
end;
retain day1-day&max_days.;
if readmit=1 then do;
num_day+1;
dayvar{num_day}=gap;
if last.readmit then output;
end;
keep studyid index day: ;
run;