【问题标题】:Loop in SAS until a specific keyword在 SAS 中循环直到特定关键字
【发布时间】:2018-06-25 17:46:05
【问题描述】:

我有一个数据集,其中有一列包含所有点击数据。有 12 个主要关键字,如果在数据中找到这些关键字中的任何一个,那么软件应该给出结果,直到出现停止关键字,即“主页”和开始关键字。它应该按 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 时停止,这将是第一个输出(b d g d)然后它应该再次从 F 开始到下一个组并停止home or b or f (f v) 这将是第二个输出,然后它将再次从 b 开始,如果遇到 b,f 或 home (b,p,home) 这将是我的第三个输出。我的代码能够组成组并给我每个组中的成员,但它不会在第一个 ID 的末尾停止。例如,我得到的输出为:第一个输出: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;

【问题讨论】:

  • 按原样运行您的代码时没有得到该结果。你能证实你做到了吗? (即,我将其复制/粘贴到我的编辑器,在第一个周围添加了必要的输入内容......)
  • 对不起乔我刚刚编辑了输入数据现在你可以试试
  • 所以你没有 home 为 1,但你想让它检测到 ID 号的变化并停在那里?

标签: loops sas


【解决方案1】:

如果您想检测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;

【讨论】:

    【解决方案2】:

    当列在 ('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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 2014-12-15
      相关资源
      最近更新 更多