2017-02-14 85 views
0

我在我的數據集中有三列:ID,Date1Date2。我需要根據Date2填寫Date1列。換句話說,如果Date1比較老,那麼Date2Date1將是相同的值。使用sas按照其他日期填寫日期

我原來的數據是:

ID |Date1  | Date2 
84 |   |13JAN2015 
84 |12NOV2014 |05FEB2015 
84 |12NOV2014 |07FEB2015 
106 |   |13JAN2015 
106 |09MAY2014 |05FEB2015 
106 |09MAY2014 |07FEB2015 
106 |09MAY2014 |09MAR2015 
153 |16JAN2015 |08OCT2015 
153 |16JAN2015 |12NOV2015 
155 |   |13JAN2015 
155 |01JUN2014 |05FEB2015 
155 |25APR2015 |12NOV2015 
155 |25APR2015 |28NOV2015 

我想獲得這樣的結果:

ID |Date1  | Date2 
84 |12NOV2014 |13JAN2015 
84 |12NOV2014 |05FEB2015 
84 |12NOV2014 |07FEB2015 
106 |09MAY2014 |13JAN2015 
106 |09MAY2014 |05FEB2015 
106 |09MAY2014 |07FEB2015 
106 |09MAY2014 |09MAR2015 
153 |16JAN2015 |08OCT2015 
153 |16JAN2015 |12NOV2015 
155 |01JUN2014 |13JAN2015 
155 |01JUN2014 |05FEB2015 
155 |25APR2015 |12NOV2015 
155 |25APR2015 |28NOV2015 

假設Date1是出生日期和Date2是收集信息的日期,那就是所有的信息出生後收集(同一個ID)必須屬於相同的出生日期,從而填補空白。

我試過使用IF聲明,但它沒有奏效。 有人可以幫助我嗎?

+0

第一條記錄如何獲得'Date1 ='「'Date1 =」12/nov/14「'形式?有些事你不知道,或者這個例子是錯誤的。 (如果你在一個datastep中提供你的數據硬編碼,這也會有所幫助。) –

+0

假設Date1是出生日期,Date2是收集信息日期,那麼在出生後(對於同一個ID)收集的所有信息必須屬於同一個ID出生日期,從而填補空白。 – Mayara

+0

你有在這裏使用的日期格式的名稱? –

回答

0

您可以使用lag()函數,該函數允許您讀取數據步驟循環中先前記錄的值。

data have; 
    infile datalines delimiter='|'; 
    length Date1$10 Date2$10; 
    input ID Date1 $ Date2 $; 
    datalines; 
84 |   |13JAN2015 
84 |12NOV2014 |05FEB2015 
84 |12NOV2014 |07FEB2015 
106 |   |13JAN2015 
106 |09MAY2014 |05FEB2015 
106 |09MAY2014 |07FEB2015 
106 |09MAY2014 |09MAR2015 
153 |16JAN2015 |08OCT2015 
153 |16JAN2015 |12NOV2015 
155 |   |13JAN2015 
155 |01JUN2014 |05FEB2015 
155 |25APR2015 |12NOV2015 
155 |25APR2015 |28NOV2015 
; 
run; 

*** convert to dates; 
data have; 
    set have; 
    format d2 d1 Date9.; 
    *Date1 = COMPRESS(tranwrd(Date1,'/',''),,'s'); 
    d1 = input(Date1,Date9.); 
    *Date2 = COMPRESS(tranwrd(Date2,'/',''),,'s'); 
    d2 = input(Date2,Date9.); 
    rename d1=Date1 d2=Date2; 
    drop Date1 Date2; 
    run; 

*** sort; 
proc sort data=have out=want; 
    by id descending Date2; 
    run;quit; 

*** if missing then fill in previous value; 
data want; 
    set want; 
    lagDate1=lag(Date1); 
    if Date1=. then Date1=lagDate1; 
    drop lagDate1; 
    run; 

*** sort back to normal; 
proc sort data=want; 
    by id Date2; 
    run;quit; 
  1. 排序數據
  2. 如果缺少然後複製以前的值
  3. 排序恢復正常

你可能想添加規則,以驗證ID是在複製日期前與之前的記錄相同。