我的数据集中有三列:ID
,Date1
和Date2
。我需要根据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
声明,但它没有用。
有人可以帮帮我吗?
答案 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;
在复制日期之前,您可能需要添加规则以验证
ID
与之前的记录相同。