使用sas根据另一个日期填写日期

时间:2017-02-14 11:30:57

标签: sas

我的数据集中有三列:IDDate1Date2。我需要根据Date1填写Date2列。换句话说,如果Date1早于Date2,那么Date1将是相同的值。

我的原始数据是:

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声明,但它没有用。 有人可以帮帮我吗?

1 个答案:

答案 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. 排序回正常
  4.   

    在复制日期之前,您可能需要添加规则以验证ID与之前的记录相同。