2

我有一个任务要解决,我对这种编程语言很陌生。当标志为 0 时,我必须选择下一个直接记录,前提是标志变量具有三个或更多连续记录且值为 1。我已经研究了几个小时。下面是数据步。请建议。

data two;
input usubjid visit flag;
cards;
1001 1 1
1001 2 1
1001 3 0
1001 4 1
1001 5 1
1001 6 1
1002 1 1
1002 2 1
1002 3 0
1002 4 1
1002 5 1
1003 1 0
1003 2 1
1003 3 1
1003 4 1
1003 5 1
;
run;

输出将是: -

usubjid visit flag
1001     4     1

1003     2     1

这是我到目前为止所尝试的。

proc sort data = two ;
        by usubjid ;    
run;
  proc transpose data = two out = tran ;
        by usubjid ;
        id visit ;var flag ;
run;
data b ;
    set tran ;
    if ( ( _1 = _2 ) and ( _1 = _3 ) ) or ( ( _2 = _3 ) and ( _2 = _4 ) ) or ( ( _3 = _4 ) and (     _3 = _5 ) ) or
        ( ( _4 = _5 ) and ( _4 = _6 ) ) ;
run;
proc sort data = b ;
    by usubjid ;
run;
data c ;
    merge a ( in = a ) b ( in = b ) ;
    by usubjid ;
    if a ;                                                                
run;                                                                                   
4

2 回答 2

2

这可能是最快和最简单的方法

  1. 在每个“0”之后计算连续的“1”,如果找到其中的3个,则继续执行步骤2。
  2. 回顾/回顾两条记录并提取它。
  3. 做显式输出。

    data two(keep=usubjid visit flag);
    set two;
    retain temp 0;
    
    if flag ne 0 then temp=temp+flag; else temp=0; 
    
    lag2_usubjid= lag2(usubjid);
    lag2_visit=lag2(visit);
    lag2_flag=lag2(flag);
    
    if temp=3 then do;
         usubjid=lag2_usubjid;
         visit=lag2_visit;
         flag=lag2_flag;
         output;
    end;        
    

    跑;

于 2014-12-02T04:41:42.513 回答
1

好的。删除了我的旧答案,因为我不完全了解您在寻找什么。

data two;
set two;
n = _n_;
run;

proc sort data=two;
by descending n ;
run;

data two;
set two;
retain count  0;
if flag then
    count = count + 1;
else 
    count = 0;
run;

proc sort data=two;
by n;
run;

data two (drop=count n);
set two;

if lag(flag) = 0 and count >=3;
run;

首先,我添加了一个行号变量。

然后按该值以相反的顺序排序。

添加一个变量,用于计算 flag=1 的连续记录数。

恢复原来的顺序。

最后,细分到您要查找的内容。

于 2014-12-02T05:11:49.710 回答