循环进入SAS,直到找到特定的关键字

时间:2018-06-25 17:46:05

标签: loops sas

我有一个数据集,其中有一个包含所有点击数据的列。有12个主要关键字,如果在数据中找到了这些关键字中的任何一个,则软件应给出结果,直到显示出“ Home”和start关键字的stop关键字为止。并且应按ID分组。因此,对于每个小组,它应该运行并给我输出。

例如:

Id column:

 1     a

 1     b

 1     d

 1     g

 1     d



2    a

2     f

2    v

2    b

2    p

2  home

关键字为:b and f因此,该软件应从b开始,并在遇到home或b或f时停止,这将是第一个输出(bdgd),然后应从F开始再次进入下一组停在home或b或f(fv),这将是第二个输出,然后它将再次从b开始,如果遇到b,f或home(b,p,home),则停止,这将是我的第三个输出。我的代码既可以组成小组,也可以给我每个小组的成员,但是它并没有停留在第一个ID的末尾。例如,我得到的输出为:1st输出:b d g d a

我不应该得到'a'。

代码是:

data want ; 

set have ; 

retain group 0 member 0 ; 

if member then member+1; 

if column in ('b','f') then do;   

member=1;   

group+1; 

end; 

if member then output; 

if column = 'home' then member=0;

run;

2 个答案:

答案 0 :(得分:0)

如果您想检测到id的变化(可能没有home,那么您需要检测last.id(或者first.id也可以在此步骤的早期进行工作-它们会以相同的方式工作。)这会告诉您何时位于特定ID值的最后一行;它需要使用by处理。

data want ; 

set have ; 

by id;

retain group 0 member 0 ; 

if member then member+1; 

if column in ('b','f') then do;   

member=1;   

group+1; 

end; 

if member then output; 

if column = 'home' or last.id then member=0;  *last.id = last row of that ID;

run;

答案 1 :(得分:0)

在('b','f','home')中的列时设置标志。

data want;
    set have;
    by ID;
    retain flag;
    if first.id then flag=0;
    if column in ('b','f','home') then flag=1;
    if flag^=0  then output;
    if column='home' then flag=0;
 run;