需要数组的帮助

时间:2012-03-09 22:11:34

标签: sas

我需要创建一些新变量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  

1 个答案:

答案 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;