SAS - 如何使用宏修改多个数据集?

时间:2016-10-21 01:01:46

标签: loops macros sas dataset

我正在尝试修改工作库下的一些数据集(它们的名称遵循特定顺序,如data_AXPM061203900_20120104,data_AXPM061203900_20120105,data_AXPA061204100_20120103,data_AXPA061204100_20120104)。例如,我想在所有数据集中删除变量“price = 0”。

我正在使用以下内容创建一个表来识别数据集:

    proc sql ;
      create table data.mytables as
      select *
      from dictionary.tables
      where libname = 'WORK' 
      order by memname ;
      quit ;

下一步,我正在尝试使用宏:

%macro test;
  proc sql ;
    select count(memname) into: obs from data.mytables;

  %let obs=&obs.;
    select catx("_", "data", substr(memname, 6, 13), substr(memname,20,27))
    into :setname1-:setname&obs.
    from data.mytables;
quit;


%do i=1 %to &obs.;

data  &&setname&i
set  &&setname&i

if bid_price= '.' then delete;
%end;
%mend test;

然而,它完全失败了。有人能给我一些建议吗?我真的不擅长宏。错误包括:

  1. 56:无法确定LINE和COLUMN。
  2. 错误56-185:当选项DATASTMTCHK = COREKEYWORDS时,不允许在DATA语句中使用SET。检查丢失的分号           DATA语句,或使用DATASTMTCHK = NONE。

1 个答案:

答案 0 :(得分:1)

您在DATA语句和SET语句中缺少分号,并且应该添加RUN语句。建议你试试:

%do i=1 %to &obs.;

  data  &&setname&i ;
    set  &&setname&i ;    
    if bid_price= '.' then delete;
  run;

%end;

请注意,DELETE语句正在删除记录,而不是删除变量。上面的代码要求bid_price是一个字符变量,并且当值为'。'时你要删除记录。