2014-12-02 80 views
2

我已经给了一个任务来解决,我对这种编程语言很陌生。当标志为0时,我必须选择下一个立即记录,,前提是标志变量具有三个或更多连续记录,其值为1.我已经持续了好几个小时。以下是datastep。请建议。SAS任务。需要有条件地挑选记录

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;                     

回答

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的连续记录数。

度假村回到原来的秩序。

最后,子集,直到你在找什么。

2

这可能是最快,最简单的方法这个

  1. 计数连续的“1”后,每个“0”,如果你发现他们的3然后进行 第二步。
  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;   
    

    run;