我有一个要解决的任务,我对这种编程语言很陌生。当标志为0时,我必须选择下一个立即记录,如果标志变量有三个或更多连续记录值为1。我已经进行了几个小时。下面是datastep。请建议。
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;
答案 0 :(得分:2)
这可能是最快最简单的
做明确的输出。
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;
运行;
答案 1 :(得分: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的连续记录数。
回到原来的订单。
最后,将子集缩小到您要查找的内容。