【问题标题】:SAS macro for creating multiple proq sql tables. Error: numeric opperand required用于创建多个 proc sql 表的 SAS 宏。错误:需要数字操作数
【发布时间】:2015-10-22 15:33:17
【问题描述】:

我有一个包含多个“XO 代码”的 ID 列表。我想创建一个宏,它将遍历这些 ID,并使用与相应 XO 代码对应的 where 语句为每个 ID 创建一个表。例如:

%let ID_77= '35X02','35X04';
%let DnO_IDs= &ID_77; /intends to add more &ID_ numbers/

%macro loop;
   proc sql;
      %do k=1 %to %sysfunc(countw(&DnO_IDs_Ids.));
         %let ID= %scan(&DnO_IDs.,&k.);
         create table EP_&ID as
         select * from table
         where XO in ("&ID.") and AY>=(&CurrY-14);
      %end;
   quit;
%mend;
%loop;

我收到此错误: 错误:在需要数字操作数的 %EVAL 函数或 %IF 条件中找到字符操作数。条件是: '35X04' 错误:宏函数 %SCAN 的参数 2 不是数字。 错误:宏 LOOP 将停止执行。

【问题讨论】:

  • 您的值列表有引号。因此,当您扫描列表时,您会将引号放入宏变量中。因此,您正在尝试创建一个名为 EP_'35X02' 的表。您应该从原始列表中删除引号或从新的 ID 宏变量中删除它们。
  • &DnO_IDs_Ids. 在做什么?与您在 %let 声明中的内容相比,这是一个额外的 &ids

标签: sas sas-macro


【解决方案1】:

引号是个问题,不需要。使用逗号作为分隔符也会带来麻烦。使用空格会更好。

%let ID_77= 35X02 35X04;
%let DnO_IDs= &ID_77; /intends to add more &ID_ numbers/
%let CurrY=2015;

%macro loop;
%local k id ;
   proc sql;
%do k=1 %to %sysfunc(countw(&DnO_IDs));
  %let ID= %scan(&DnO_IDs,&k);
     create table EP_&ID as 
       select * from table
       where XO in ("&ID") and AY>=(&CurrY-14)
     ;
%end;
  quit;
%mend;
%loop;

如果您确实想将值用作逗号分隔列表,那么您需要适当地修改您的 COUNTW()%SCAN() 函数调用,并添加对 DEQUOTE() 的调用以删除引号。

%let ID_77= '35X02','35X04';

... %sysfunc(countw(%superq(DnO_IDs),%str(,)));
  %let ID= %sysfunc(dequote(%scan(%superq(DnO_IDs),&k,%str(,))));

【讨论】:

  • 我相应地编辑了代码,现在收到此错误:错误:无效的符号变量名称'35X02','35X04'。这些代码之前已经在proc sql表中以逗号分隔和引号格式引用,所以我不明白为什么现在变量名会无效
  • 不看日志很难判断。你不会使用'35X02','35X04' 作为任何东西的名称。作为XO in ('35X02','35X04') 之类的语句的一部分,它可能很有用。也许这些值仍然是宏引用的?如果您应用了宏引用,您可以尝试使用 %unquote() 宏函数从值中删除宏引用,以便宏处理器将未引用的字符传递给 SAS 语言处理器。
  • 仅供参考,SAS 的最佳实践是不要这样做。很少需要以这种方式拆分数据,因为 BY 组处理非常有效。否则,这里有一个关于完成此任务的几种常见方法的文章。 sascommunity.org/wiki/Split_Data_into_Subsets
【解决方案2】:

我认为这应该可以解决问题: %do k=1 %to %eval(%sysfunc(countw(&DnO_IDs_Ids.)));

可能是 %sysfunc 返回值被认为是非整数。

【讨论】:

  • SAS 宏语言在宏变量方面没有“整数”的概念。这正是 %scan 函数在内部执行的操作,并且失败了。
  • 是的..我的错。 %EVAL 将自动添加到 %SCAN 和 %QSCAN。反正再添加也是多余的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
相关资源
最近更新 更多