在SAS中满足组内两个条件的组内创建标志

在SAS中满足组内两个条件的组内创建标志,sas,Sas,我需要的是使flag(_flg2)变量满足以下条件。 在id内,ALT或AST应将_FLG设置为“Y”,ALP和TSB必须在24小时窗口内将_FLG设置为“Y”。i、 e.在24小时内,ALT/AST、ALP和TSB应为“Y” 最终数据集将包含每个id的一个观察值。对于(001002004005007)中的id,_flg2变量将为“Y”,对于剩余id(003006)将为缺失 请让我知道,如果这需要任何进一步的澄清 提前谢谢 我试过的代码如下: data abc; length datec $19

我需要的是使flag(_flg2)变量满足以下条件。 在id内,ALT或AST应将_FLG设置为“Y”,ALP和TSB必须在24小时窗口内将_FLG设置为“Y”。i、 e.在24小时内,ALT/AST、ALP和TSB应为“Y”

最终数据集将包含每个id的一个观察值。对于(001002004005007)中的id,_flg2变量将为“Y”,对于剩余id(003006)将为缺失

请让我知道,如果这需要任何进一步的澄清

提前谢谢

我试过的代码如下:

data abc;
length datec $19; 
input id $ param $ datec $ _flg $;
daten = input(datec,is8601dt.);
format daten is8601dt.;
cards;
001 ALT 2013-01-20T09:16 Y
001 AST 2013-01-20T09:16 Y
001 ALP 2013-01-20T09:16 Y
001 TSB 2013-01-21T09:14 Y
002 ALT 2013-02-20T08:16 N
002 AST 2013-02-20T08:16 Y
002 ALP 2013-02-20T08:16 Y
002 TSB 2013-02-21T08:14 Y
003 ALT 2013-01-20T09:16 Y
003 AST 2013-01-20T09:16 Y
003 ALP 2013-01-20T09:16 N
003 TSB 2013-01-21T09:14 N
004 ALT 2013-08-19T09:16 N
004 AST 2013-08-20T09:16 N
004 ALP 2013-08-20T09:16 Y
004 TSB 2013-08-20T11:14 Y
004 ALT 2013-08-21T09:00 Y
005 ALT 2013-08-19T11:16 Y
005 AST 2013-08-20T09:16 Y
005 ALP 2013-08-20T12:16 Y
005 TSB 2013-08-20T11:14 Y
006 ALT 2013-08-19T07:16 Y
006 ALT 2013-08-20T08:16 N
006 AST 2013-08-20T08:16 N
006 ALP 2013-08-20T08:14 Y
006 TSB 2013-08-20T08:16 Y
006 TSB 2013-08-20T08:14 Y
007 ALT 2013-08-19T10:16 Y
007 ALT 2013-08-20T08:16 N
007 AST 2013-08-20T08:16 N
007 ALP 2013-08-20T08:14 Y
007 TSB 2013-08-20T08:16 Y
007 TSB 2013-08-21T08:14 Y
;
run;

以下数据步骤应起作用:

proc sort data=abc out=_1;
    by id datec;
run;

data _2;
    set _1 (where=(_FLG = "Y"));
by id datec;
    if _FLG = "Y" then _flg1 = 1;
run;

proc transpose data=_2 out=_3(drop=_NAME_) ;
    by id datec daten;
    var _flg1;
    id param;
run;

data _4 (keep=id alt ast alp tsb daten dtchk dtdif);
    set _3;
    by id datec daten;
    dtdif=dif(daten)/3600;
    if first.id then dtdif=.;
if . lt dtdif lt 24 then dtchk=daten-dtdif*3600;
    format dtchk datetime.;
run;

data _5 (keep=id daten);
    set _4;
    where dtchk ne .;
    by id daten;
    if last.id;
run;

data _6;
    merge   _4(keep=id alt ast alp tsb daten)
            _4(keep=id alt ast alp tsb daten dtchk
            rename=(daten=refdt dtchk=daten alt=alt24 ast=ast24 alp=alp24     tsb=tsb24) where=(daten ne .))
            _5(in=ina);
    by id daten;
    if not ina;
    altf=max(of alt:);
    astf=max(of ast:);
    alpf=max(of alp:);
    tsbf=max(of tsb:);
    if . lt sum(altf, astf) le 2 and sum(alpf, tsbf) = 2 then _FLG2 = "Y";
run;
数据已经存在;
输入@1id$3@五元三角@9日期yymmdd10@20次5@26.1美元。;
格式datetime为8601dt。日期yymmdd10。时间。;
datetime=dhms(日期,小时(时间),分钟(时间),0);
卡;
001 ALT 2013-01-20T09:16 Y
001 AST 2013-01-20T09:16 Y
001 ALP 2013-01-20T09:16 Y
001 TSB 2013-01-21T09:14 Y
002 ALT 2013-02-20T08:16北纬
2002 AST 2013-02-20T08:16 Y
002 ALP 2013-02-20T08:16 Y
002 TSB 2013-02-21T08:14 Y
003 ALT 2013-01-20T09:16 Y
03 AST 2013-01-20T09:16 Y
003阿尔卑斯山2013-01-20T09:16北纬
003 TSB 2013-01-21T09:14北纬
2004 ALT 2013-08-19T09:16北纬
2004 AST 2013-08-20T09:16北
004阿尔卑斯山2013-08-20T09:16 Y
2004 TSB 2013-08-20T11:14 Y
2004 ALT 2013-08-21T09:00 Y
005 ALT 2013-08-19T11:16 Y
2005 AST 2013-08-20T09:16 Y
005 ALP 2013-08-20T12:16 Y
005 TSB 2013-08-20T11:14 Y
006 ALT 2013-08-19T07:16 Y
006 ALT 2013-08-20T08:16北纬
美国东部时间2013-08-20T08:16北
2006阿尔卑斯山2013-08-20T08:14 Y
2006 TSB 2013-08-20T08:16 Y
2006 TSB 2013-08-20T08:14 Y
007 ALT 2013-08-19T10:16 Y
007 ALT 2013-08-20T08:16北纬
007 AST 2013-08-20T08:16北
007阿尔卑斯山2013-08-20T08:14 Y
007 TSB 2013-08-20T08:16 Y
007 TSB 2013-08-21T08:14 Y
;
跑
proc sort data=have;
按身份证日期;
跑
数据需求;
直到(最后一个id)为止;
集合have(其中=(标志='Y'));
按身份证;
选择(参数);
当('ALT','AST')dt1=datetime时;
当('ALP')dt2=日期时间;
当('TSB')dt3=日期时间时;
结束;

如果intck('dtmin',0,range(dt1-dt3的))和您已经尝试过的代码…?我已经用我正在尝试的代码更新了问题。您确定ID 004和007的flag2应该是Y吗?根据您自己的逻辑,我认为它们不符合条件。@user667489-是的,004和007的flag2应该是Y,因为在004的情况下,ALP(2013-08-20T09:16)、TSB(2013-08-20T11:14)和ALT(2013-08-21T09:00)都是Y,并且在24小时窗口内。007也一样,ALT(2013-08-19T10:16)、ALP(2013-08-20T08:14)和TSB(2013-08-20T08:16)或TSB(2013-08-21T08:14)都是Y,并且在24小时窗口内。004和007应该有flag2作为Y,因为在004的情况下,ALP(2013-08-20T09:16)、TSB(2013-08-20T11:14)和ALT(2013-08-21T09:00)都是Y,并且在24小时窗口内。007也一样,ALT(2013-08-19T10:16)、ALP(2013-08-20T08:14)和TSB(2013-08-20T08:16)或TSB(2013-08-21T08:14)都是Y,并且都在24小时窗口内。您给出的代码适用于给定的数据,在过滤flag1=“Y”上的have数据后,它会给出所需的结果(即001002004005007的Y)。非常感谢。但我不理解你关于假设004和007的flag2缺失的评论,由于您的代码也为这些id提供了Y…很抱歉-在我用来读取原始数据的数据步骤中有一个错误,这意味着它读取的是11:00作为01:00等。在我修复了它与您的所有测试用例匹配后。如果只收集了日期,您能让我知道intck函数中会包含哪些更改吗,当ALT/AST&ALP&TSB在同一日期为“Y”时,只有那些ID的flag2才应该为Y?如果您使用的是日期变量而不是日期时间变量,请尝试使用
'day'
而不是
'dtmin'
,或者干脆去掉
intck
,并使用
范围(dt1-dt3)=0
作为该行的第一个条件。
data have;
  input @1 id $3. @5 param $3. @9 date yymmdd10. @20 time time5. @26 FLAG $1.;
  format datetime is8601dt. date yymmdd10. time time5.;
  datetime = dhms(date,hour(time),minute(time),0);
cards;
001 ALT 2013-01-20T09:16 Y
001 AST 2013-01-20T09:16 Y
001 ALP 2013-01-20T09:16 Y
001 TSB 2013-01-21T09:14 Y
002 ALT 2013-02-20T08:16 N
002 AST 2013-02-20T08:16 Y
002 ALP 2013-02-20T08:16 Y
002 TSB 2013-02-21T08:14 Y
003 ALT 2013-01-20T09:16 Y
003 AST 2013-01-20T09:16 Y
003 ALP 2013-01-20T09:16 N
003 TSB 2013-01-21T09:14 N
004 ALT 2013-08-19T09:16 N
004 AST 2013-08-20T09:16 N
004 ALP 2013-08-20T09:16 Y
004 TSB 2013-08-20T11:14 Y
004 ALT 2013-08-21T09:00 Y
005 ALT 2013-08-19T11:16 Y
005 AST 2013-08-20T09:16 Y
005 ALP 2013-08-20T12:16 Y
005 TSB 2013-08-20T11:14 Y
006 ALT 2013-08-19T07:16 Y
006 ALT 2013-08-20T08:16 N
006 AST 2013-08-20T08:16 N
006 ALP 2013-08-20T08:14 Y
006 TSB 2013-08-20T08:16 Y
006 TSB 2013-08-20T08:14 Y
007 ALT 2013-08-19T10:16 Y
007 ALT 2013-08-20T08:16 N
007 AST 2013-08-20T08:16 N
007 ALP 2013-08-20T08:14 Y
007 TSB 2013-08-20T08:16 Y
007 TSB 2013-08-21T08:14 Y
;
run;

proc sort data = have;
  by id date;
run;

data want;
  do until(last.id);
    set have(where = (FLAG = 'Y'));
    by id;
    select(param);
      when('ALT','AST') dt1 = datetime;
      when('ALP')       dt2 = datetime;
      when('TSB')       dt3 = datetime;
    end;
    if intck('dtmin',0,range(of dt1-dt3)) <= 24*60 and nmiss(of dt1-dt3) = 0 then FLAG2 = 'Y';
  end;
  call missing(of dt1-dt3);
  drop dt1-dt3;
run;