SAS CATX错误:CATX的空参数无效

SAS CATX错误:CATX的空参数无效,sas,Sas,我试图在SAS企业指南中连接一些变量 我从一个SAS_表开始,它看起来像(注意空列plums和pears的空观察值): id farm apples pears cherries plums 1 'Munich' 'Granny' 'Williams' 'RedDelight' 2 'Amsterdam' 'PinkLady'

我试图在SAS企业指南中连接一些变量

我从一个
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(“::”,关于农场——李子);
对我来说很有效,但是封闭变量最终没有起作用。这是一个快速解决方案,所以谢谢:-)这很有意义。谢谢你花时间彻底回答它。代码以这种方式完美地工作。