If statement 如何更新SAS/if条件中以前保留的行?

If statement 如何更新SAS/if条件中以前保留的行?,if-statement,sas,rows,lag,retain,If Statement,Sas,Rows,Lag,Retain,我有一个这样的数据库。这对应于一个人,我有多个人的这类数据 data test; input date YYMMDD10. real_length min_length; format date YYMMDD10.; cards; 2000-02-23 1 7 2000-02-24 12 15 2000-03-07 15 7 2000-03-22 7 15 2000-03-29 13 7 2000-04-11 17 7 2000-04-28 . 7 run; 我要寻找的是:如果连续行中两个日期

我有一个这样的数据库。这对应于一个人,我有多个人的这类数据

data test;
input date YYMMDD10. real_length min_length;
format date YYMMDD10.;
cards;
2000-02-23 1 7
2000-02-24 12 15
2000-03-07 15 7
2000-03-22 7 15
2000-03-29 13 7
2000-04-11 17 7
2000-04-28 . 7
run;
我要寻找的是:如果连续行中两个日期之间的间隔(实际长度)低于某个长度(最小长度),我想用前一个日期+最小长度替换下一行中的日期。到目前为止,这不是一个问题,下面是我用来实现它的代码:

data test2;
set test;
format lagdate min_date YYMMDD10.;
retain lagmin lagdate;
if lag(real_length) < lag(min_length) and lag(real_length) ~= . then min_date = lagdate       + lagmin;
else  min_date = date;
lagdate = min_date;
lagmin = min_length;
run;
问题是,现在两个连续日期之间的间隔可能会小于最小长度,例如:2000-03-22-2000-03-16=6天
date            min_date       min_length
2000-02-23      2000-02-23         7
2000-02-24      2000-03-01         15
2000-03-07      2000-03-16         7
2000-03-22      2000-03-23         15
...
所以我试过这个代码,但它不起作用。。。我相信问题可能在if条件下

data test2;
set test;
format lagdate min_date YYMMDD10.;
retain lagmin lagdate;
if (lag(real_length) < lag(min_length) and lag(real_length) ~= .) or (adjust_length <                  lag(min_length) and adjust_length ~=.) then min_date = lagdate + lagmin;
else  min_date = date;
adjust_length = min_date - lagdate;
lagdate = min_date;
lagmin = min_length;
run;
数据测试2;
集合测试;
格式lagdate min_date YYMMDD10。;
保留lagmin lagdate;
如果(lag(real_length)
有人知道为什么这不起作用吗?或者你有其他的方法吗


谢谢大家!

问题在于,每次调整一个日期时,如果后续日期都集中在一起,则也必须移动所有日期。我认为你可以这样做,将你在前几行中添加的天数保持在一个连续的总数上,然后只添加之后所需的天数,以获得日期之间的最小长度:

data want;
    set test;
    format t_min_date min_date yymmdd10.;
    if _n_ = 1 then total_adj = 0;
    t_min_date = date + min_length + total_adj;
    min_date = lag1(t_min_date);
    total_adj + max(0,min_length - real_length);
run;
这就是你的目标吗

注意:您需要使用一些
first.id
last.id
逻辑来替换
if\u N_uu=1
,以使此操作适用于同一数据集中的多个个人

data want;
    set test;
    format t_min_date min_date yymmdd10.;
    if _n_ = 1 then total_adj = 0;
    t_min_date = date + min_length + total_adj;
    min_date = lag1(t_min_date);
    total_adj + max(0,min_length - real_length);
run;