2012-03-09 238 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