【问题标题】:SAS - How to modify several datasets using a macro?SAS - 如何使用宏修改多个数据集?
【发布时间】:2017-03-03 04:22:35
【问题描述】:

我正在尝试修改工作库下的一些数据集(它们的名称遵循一定的顺序,如 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:无法确定行和列。
  2. 错误56-185:在选项DatastMtchk = CoreKeywords时,不允许在Data语句中允许设置。检查缺少的分号 DATA 语句,或使用 DATASTMTCHK=NONE。

【问题讨论】:

    标签: loops macros sas dataset


    【解决方案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 是一个字符变量,并且当值为 '.' 时您要删除记录。

    【讨论】:

    • MODIFY 语句代替SET 怎么样?
    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多