SAS CATX错误:CATX的空参数无效
我试图在SAS企业指南中连接一些变量 我从一个SAS CATX错误:CATX的空参数无效,sas,Sas,我试图在SAS企业指南中连接一些变量 我从一个SAS_表开始,它看起来像(注意空列plums和pears的空观察值): id farm apples pears cherries plums 1 'Munich' 'Granny' 'Williams' 'RedDelight' 2 'Amsterdam' 'PinkLady'
SAS_表开始,它看起来像(注意空列plums
和pears
的空观察值):
id farm apples pears cherries plums
1 'Munich' 'Granny' 'Williams' 'RedDelight'
2 'Amsterdam' 'PinkLady' 'Scrumptious
3 'Moscow' 'Braeburn' 'Williams' 'RedDelight'
然后我创建全局变量,如下所示:
%do i = 1 %to 3;
%global farm_&i., apples_&i., pears_&i., cherries_&i., plums_&i.;
%end;
data _NULL_;
set SAS_table;
%do i = 1 %to 3;
if id = &i. then do;
call symput("farm_&i.", farm);
call symput("apples_&i.", apples);
call symput("pears_&i.", pears);
call symput("cherries_&i.", cherries);
call symput("plums_&i.", plums);
end;
%end;
run;
我将上表存储在全局变量中,如下所示:
%do i = 1 %to 3;
%global farm_&i., apples_&i., pears_&i., cherries_&i., plums_&i.;
%end;
data _NULL_;
set SAS_table;
%do i = 1 %to 3;
if id = &i. then do;
call symput("farm_&i.", farm);
call symput("apples_&i.", apples);
call symput("pears_&i.", pears);
call symput("cherries_&i.", cherries);
call symput("plums_&i.", plums);
end;
%end;
run;
以上所有操作似乎都很顺利。在下一步中,我希望对各个变量进行分析,以获得以下输出(请注意,空值只是被跳过了-没有为这些情况设置额外的分隔符(“:”):
为此,我使用以下代码:
data _NULL_;
%do i = 1 %to 3;
call_symput("concat_&i",catx(" :: ", &&farm_&i., &&apples_&i.., &&pears_&i..,
&&cherries_&i.., &&plums_&i..));
%end;
run;
但是,当我运行此代码时,会出现以下错误:
ERROR 159-185: Null parameters for CATX are invalid.
我的假设是SAS不满意,因为一些变量可能是空值。但是我如何解决这个问题呢?我把加载搞得一团糟,似乎找不到一个好的答案。在我看来,您的宏变量中的值类似于Munich
。因此,您的宏生成的SAS代码需要生成类似于“Munich”
的字符串文字,否则SAS将查找具有该名称的变量。这也解释了有关空值的错误,因为如果没有引号将空值转换为字符串文字,则会导致使用相邻分隔符的CATX()
调用
data _NULL_;
%do i = 1 %to 3;
call_symput("concat_&i",catx(" :: ", "&&farm_&i.", "&&apples_&i.."
, "&&pears_&i..", "&&cherries_&i..", "&&plums_&i.."))
;
%end;
run;
您可以使用引号生成宏变量,但它们可能不如这种形式的宏变量有用。因此,您可以更改生成宏变量的早期语句,而不是更改上次调用的symput()语句。您还可以从该步骤中删除不需要的宏代码
data _NULL_;
set SAS_table;
call symput(cats("farm_",id), quote(farm));
call symput(cats("apples_",id), quote(apples));
call symput(cats("pears_",id), quote(pears));
call symput(cats("cherries_",id), quote(cherries));
call symput(cats("plums_",id), quote(plums));
run;
在CATX()中,您需要将宏变量括在引号中。现在它正在查找导致问题的所有空变量名。Ps CATX(“::”,farms--plums);应该从一开始就可以工作。为什么要处理宏变量中的所有这些混乱?请使用数据步骤。@Joe:因为客户这样说@Reeza:CATX(“::”,关于农场——李子);
对我来说很有效,但是封闭变量最终没有起作用。这是一个快速解决方案,所以谢谢:-)这很有意义。谢谢你花时间彻底回答它。代码以这种方式完美地工作。