从数据库 (SAS) 中删除以值列表开头的所有观察值

时间:2021-06-08 15:22:45

标签: sas macros dataset sas-macro

我正在尝试找到优化的方法:

我想从一个字符变量中删除所有以不同可能字符串开头的观察结果,例如:

“小计”“包括:” 因此,如果它以这些值中的任何一个(或我没有在此处写的许多其他值)开头,则将它们从数据集中删除。

最好的解决方案是一个包含所有值的宏变量,但我不知道如何处理它。 (%let list = Subtotal Include: 但当它们是值时将它们计为变量)

我这样做了:

数据一;设置 b ; 如果 findw(product,"Subtotal") 然后删除; 如果 findw(product,"Inincluding:") 然后删除; ... ...

希望得到任何建议!谢谢

1 个答案:

答案 0 :(得分:3)

首先弄清楚你想要什么 SAS 代码。然后你就可以开始担心如何使用宏逻辑或宏变量了。

你只是排除以值开头的字符串吗?

data want ;
  set have ;
  where product not in: ("Subtotal" "Including");
run;

还是要根据字符串变量中的第一个“单词”进行子集化?

  where scan(product,1) not in ("Subtotal" "Including");

或者可能不区分大小写?

  where lowcase(scan(product,1)) not in ("subtotal" "including");

现在,如果值列表足够小(小于 64K 字节),那么您可以将列表放入宏变量中。

  %let list="Subtotal" "Including";

然后使用宏变量生成 WHERE 语句。

  where product not in: (&list);

您甚至可以从前缀值的数据集中生成宏变量。

proc sql noprint;
  select quote(trim(prefix)) into :list separated by ' '
    from prefixes 
  ;
quit;