新SAS用户。
我正在学习如何使用/编写宏。我试图在数据集“zonelist”中循环变量ZONE,并计算数据集中的观察数。这是我的代码:
data _null_;
set zonelist;
call symput ('zone'||_n_, zone);
call symput ('numzones', _n_);
run;
我希望这可以创建变量'zone1','zone2'等来在do循环中调用它们。这是一种合理的方法,对吧?无论如何,SAS似乎在为我的变量名添加空格。运行时我收到此错误:
ERROR: Symbolic variable name ZONE 1 must contain only
letters, digits, and underscores. NOTE: Invalid argument to function
SYMPUT('zone '[12 of 16 characters shown],'100 '[12 of
16 characters shown]) at line 567 column 10. zone=100 _ERROR_=1 _N_=1
当然,我的数据集中的每个观察都会得到相同的错误。有意义的是为什么表中的ZONE值会有一堆空格(我认为该变量是16美元),但为什么它会将所有空间添加到我的变量名中呢?我在这里错过了什么?
答案 0 :(得分:1)
由于_n_
变量的数字/字符转换,会发生这种情况。当数值转换为字符时,它们是右对齐的。
请尝试以下方法:
data _null_;
set zonelist;
call symputx(cats('zone',_n_), zone);
call symputx('numzones', _n_);
run;
cats
函数将执行数字/字符转换,并删除前导空格。
如果您有SAS 9,那么您也可以使用symputX
功能从宏VALUES中去除前导/尾随空白。
答案 1 :(得分:0)
我使用“compress”解决了它,只删除了所有空格:
data _null_;
set zonelist;
call symputx(compress('zone',_n_), zone);
call symputx('numzones', _n_);
run;
然而,这并不能帮助我理解为什么我根本不需要这样做。任何启蒙都会受到赞赏!
答案 2 :(得分:0)
SAS有两种类型的变量,固定长度字符串和浮点数。让我们来看看你的第一个陈述。
call symput ('zone'||_n_, zone);
在那里你引用了两个变量和一个字符串文字。由于||
运算符用于字符变量,因此SAS需要将数值变量_n_
隐式转换为字符串。 SAS将使用best12.
格式,因此会生成' 1'
之类的值。因此,您最终会得到一个用于宏变量名称的call symput()
函数的无效值。
但那个第三个值,即变量zone
呢?如果zone是一个数字,那么将发生相同的隐式转换,并且宏变量将最终包含前导空格。或者,zone变量是一个字符串,在这种情况下,您的宏变量很可能最终会有尾随空格,除非区域值的长度恰好与定义变量区域的最大长度匹配。
正如其他人所说,有两件事要做以解决这个问题。
首先使用call symputx()
而不是call symput()
(除非您确实希望这些尾随空格存储在您的宏变量中),这将自动strip()
输入值。它还会使关于隐式数字到字符转换的注释保持沉默。
第二种是使用一些生成不插入空格的宏可变名称的方法。最简单的方法是使用cats()
函数而不是||
运算符。但您也可以使用其他功能的组合,例如put()
,compress()
,strip()
等。
call symputx(cats('zone',_n_),zone);