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

时间:2017-03-16 12:49:30

标签: sas

我正在尝试连接SAS Enterprise指南中的一些变量。

我从SAS_table开始,看起来像是(注意空列plumspears的空洞观察:

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; 

以上所有内容似乎都很顺利。在下一步中,我希望各个变量得到以下输出(请注意,只是跳过空值 - 没有为这些情况设置额外的分隔符(" ::")):

concat_1:      Munich :: Granny :: Williams :: RedDelight
concat_2:      Amsterdam :: PinkLady :: Scrumptious
concat_3:      Moscow :: Braeburn :: Williams :: RedDelight

为此,我使用以下代码:

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不满意,因为有些变量可能是空值。但是我该如何解决这个问题呢?我已经搞砸了负荷,似乎无法找到一个好的答案。

1 个答案:

答案 0 :(得分:1)

在我看来,您的宏变量将包含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;