如何获取sas中最后一个未丢失的前两个连续丢失

如何获取sas中最后一个未丢失的前两个连续丢失,sas,Sas,我正在尝试选择ADT的最后一个非缺失DAT值,如果子对象有两个连续缺失的DAT,则最新的DAT将设置为ADT值。 下面的代码生成了我所拥有的数据,我希望ADT可以通过下面的规则(最终合并到这个集合中,或者只是创建到一个全新的集合中)来推导: 对于该受试者的受试者ID 1001:1997-05-01,没有连续缺失(尽管只有单个非连续缺失) 对于受试者1002:1998-02-01,由于该受试者在2-5的位置连续缺失 对于受试者1003:1999-03-08,由于第一个连续缺失发生在4的AVISIT

我正在尝试选择ADT的最后一个非缺失DAT值,如果子对象有两个连续缺失的DAT,则最新的DAT将设置为ADT值。 下面的代码生成了我所拥有的数据,我希望ADT可以通过下面的规则(最终合并到这个集合中,或者只是创建到一个全新的集合中)来推导:

对于该受试者的受试者ID 1001:1997-05-01,没有连续缺失(尽管只有单个非连续缺失)

对于受试者1002:1998-02-01,由于该受试者在2-5的位置连续缺失

对于受试者1003:1999-03-08,由于第一个连续缺失发生在4的AVISIT,并且在AVISIT=3时,没有缺失数据

希望你能帮助我。谢谢

data have;
infile datalines truncover;
input subjid avisit dat : yymmdd10.;
format dat yymmdd10.;
datalines;
1001 0 1997-01-01
1001 1 1997-02-01
1001 2
1001 3 1997-05-01
1002 0 1998-01-01
1002 1 1998-02-01
1002 2
1002 3
1002 4
1002 5
1002 6 1998-12-01
1003 0 1999-01-01
1003 1 1999-02-01
1003 2
1003 3 1999-03-08
1003 4
1003 5 
1003 6 1999-05-01
1003 7
1003 8
;
run;

每当连续缺失的
dat
计数大于或等于2时,下面将创建一个包含最后一个非缺失的
dat
的数据集。每次遇到缺失的
dat
,我们都会将连续缺失计数器
nmiss
增加1

我们总是将
dat
的最后一个有效值存储在变量
last\u nonmissing\u dat
last\u nonmissing\u avisit
中,以便在遇到缺失值时,它们总是结转。当出现两个连续的缺失值时,我们输出结果

每当我们移动到一个新的
subkid
时,就会重置
nmiss
last\u nonmissing

data want;
    set have;
    by subjid;
    retain last_nonmissing_dat
           last_nonmissing_avisit
    ;

    if(first.subjid) then call missing(nmiss, of last_nonmissing:);

    if(missing(dat)) then nmiss+1;
        else do;
            nmiss = 0;
            last_nonmissing_dat    = dat;
            last_nonmissing_avisit = avisit;
        end;

    if(nmiss GE 2) then output;

    format last_nonmissing_dat yymmdd10.;
run;

每当连续缺失的
dat
计数大于或等于2时,下面将创建一个包含最后一个非缺失的
dat
的数据集。每次遇到缺失的
dat
,我们都会将连续缺失计数器
nmiss
增加1

我们总是将
dat
的最后一个有效值存储在变量
last\u nonmissing\u dat
last\u nonmissing\u avisit
中,以便在遇到缺失值时,它们总是结转。当出现两个连续的缺失值时,我们输出结果

每当我们移动到一个新的
subkid
时,就会重置
nmiss
last\u nonmissing

data want;
    set have;
    by subjid;
    retain last_nonmissing_dat
           last_nonmissing_avisit
    ;

    if(first.subjid) then call missing(nmiss, of last_nonmissing:);

    if(missing(dat)) then nmiss+1;
        else do;
            nmiss = 0;
            last_nonmissing_dat    = dat;
            last_nonmissing_avisit = avisit;
        end;

    if(nmiss GE 2) then output;

    format last_nonmissing_dat yymmdd10.;
run;

这两个缺失值是否需要设置为非缺失值,或者您只是试图创建一个包含这些值的数据集?实际上,不需要将缺失值设置为非缺失值,只需创建一个新数据集即可。感谢您的快速评论。是否需要将两个缺少的值设置为非缺少,或者您只是尝试创建一个包含这些值的数据集?实际上,不需要将缺少的值设置为非缺少,只需创建一个新数据集即可。谢谢你的快速评论。非常感谢斯图。实际上,我意识到遗漏了一个关键点:我希望在第一次连续遗漏之前,最早的DAT。由于您的逻辑,我可以使用下面的代码找到这些信息,如果您能指导我如何修改数据步骤以实现这一点,那会更好:
proc sql;选择不同的SubjectID,min(最后一个非缺失数据)作为adt格式=yymmdd10。按subcid从want组中删除;退出当前使用SQL作为第二步执行此操作的方式可能是最简单的方式。这一切都可以在单个数据步骤中完成,但这可能会大大增加其复杂性。两步法是两者之间很好的平衡。非常感谢斯图。实际上,我意识到遗漏了一个关键点:我希望在第一次连续遗漏之前,最早的DAT。由于您的逻辑,我可以使用下面的代码找到这些信息,如果您能指导我如何修改数据步骤以实现这一点,那会更好:
proc sql;选择不同的SubjectID,min(最后一个非缺失数据)作为adt格式=yymmdd10。按subcid从want组中删除;退出当前使用SQL作为第二步执行此操作的方式可能是最简单的方式。这一切都可以在单个数据步骤中完成,但这可能会大大增加其复杂性。两步法是两者之间的良好平衡。