【问题标题】:SAS CATX Error: Null Parameters for CATX are invalidSAS CATX 错误:CATX 的空参数无效
【发布时间】:2017-08-07 15:47:27
【问题描述】:

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

我从SAS_table 开始,它看起来像(注意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; 

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

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

【问题讨论】:

  • 在您的 CATX() 中,您需要将宏变量括在引号中。现在它正在寻找导致问题的全部为空的变量名。
  • Ps catx('::', of farms--plums);应该从一开始就工作。
  • 你为什么要处理所有这些宏变量中的混乱?使用数据步骤。
  • @Joe:因为客户这么说@Reeza:catx('::', of farms--plums); 对我有用,但包含变量并没有最终起作用。不过,这可以作为一个快速修复,所以谢谢:-)

标签: sas


【解决方案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; 

您可以改为使用引号生成宏变量,但它们作为该形式的宏变量可能不太有用。因此,与其更改最后一个 call 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; 

【讨论】:

  • 这很有意义。感谢您花时间彻底回答。代码以这种方式完美运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多