2012-03-09 99 views
-2

我需要创建一些新的变量day1day2day3等,如果readmit=1然后做day[i]每个day[i]=gap例如,前两个重新接纳应该得到day[1]=21day[2]=9。那么下一个readmit=1,对于第三个readmit,第四个readmit和第五个readmit=1应该得到结果day[1]=29day[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 
+1

在编辑器中使用'code'代码块,并将数据安排在表格中。 – 2012-03-09 22:24:13

+0

另外,请删除您示例中不需要的任何列。 – RWill 2012-03-09 23:02:46

+0

你的问题不是很清楚。你能否试图更清楚地描述你想要的? @ RWill的建议是帮助我们更清楚地说明这个例子。最后,让人们回答你的问题的一个好办法是回到以前的问题,并将最好的问题标记为“接受”。 – itzy 2012-03-10 18:09:02

回答

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; 
+0

感谢Keith。这就是我想要的。超!谢谢你弄清楚我不清楚的表达,并感谢你的时间。 – user1238178 2012-03-16 15:15:03