Sas 需要阵列的帮助吗

Sas 需要阵列的帮助吗,sas,Sas,我需要创建一些新变量day1day2day3等。如果readmit=1则执行day[I]每个day[I]=gap,例如,前两次重新提交应该得到day[1]=21day[2]=9。然后下一次readmit=1,对于第三次、第四次和第五次readmit=1应该得到结果day[1]=29day[2]=12day[3]=23,依此类推。希望我表达得足够好。提前谢谢 STUDYID index readmit gap 10001 1 0

我需要创建一些新变量
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]=12day[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  

我想下面的代码回答了你的问题。这需要进行两次数据传递,第一次用于计算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;

请使用编辑器中的
code
块,将数据排列在表格中。此外,请去掉示例中不需要的任何列。您的问题不是很清楚。你能试着更清楚地描述一下你想要什么吗?还有@RWill的建议,有助于使示例更加清晰。最后,让人们有动力回答你的问题的一个好方法是回到前面的问题,并将最好的问题标记为“已接受”。谢谢Robbie帮我修改。我留下这些专栏,以防需要它来帮助我弄清楚。无论如何,下次我会把它移除。谢谢你的提问,基思。这就是我想要的。超级的!谢谢你找出我不清楚的表情,谢谢你抽出时间。