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