我正在寻找一种在执行数据步骤时创建包含数据集某些值的字符串变量的方法。
示例数据集 work.test:
AddToStringYN Value
Y One
Y Two
N Three
Y Four
N Five
所以最后,变量看起来像:OneTwoFour(甚至更好的 FourTwoOne)。这看起来很简单,但我似乎找不到办法做到这一点。我还尝试使用这样的宏变量:
%let stringvar=;
Data _null_;
set work.test;
if AddToStringYN = "Y" then do;
call symput('stringvar',"&stringvar" || strip(value));
end;
Run;
但这给出了:
GLOBAL STRINGVAR Four
所以我只得到最后一个值。我知道这一定是因为我对这个宏工具有一些误解,但我不明白为什么变量中只有最后一个值。我以为只有最后一次调用 symput 才实际执行了它或其他什么,但是当我将代码调整为:
%let stringvar=;
Data _null_;
set work.test;
if AddToStringYN = "Y" then do;
call symput('stringvar'||strip(value),"&stringvar" || strip(value));
end;
Run;
然后我确实得到了它们:
GLOBAL STRINGVARONE One
GLOBAL STRINGVARTWO Two
GLOBAL STRINGVARFOUR Four
所以我最后的猜测是,通过数据步骤,'call symput...' 行实际上被添加到宏处理器中,其中 "&stringvar" 已经被替换,并且只有在最后的语句之后它们才会全部执行。
这是一个很好的假设还是有其他解释?回到最初的问题:有没有一种简单的方法可以实现这一点(具有所需的变量)?