SAS是否在CALL SYMPUT变量名中添加空格?
新的SAS用户 我现在正在学习使用/编写宏。我试图在数据集“ZonelList”中循环遍历可变区域,并计算数据集中的观察数。这是我的密码:SAS是否在CALL SYMPUT变量名中添加空格?,sas,Sas,新的SAS用户 我现在正在学习使用/编写宏。我试图在数据集“ZonelList”中循环遍历可变区域,并计算数据集中的观察数。这是我的密码: data _null_; set zonelist; call symput ('zone'||_n_, zone); call symput ('numzones', _n_); run; 我希望这会创建变量“zone1”、“zone2”等,以便在do循环中调用它们。这是一个合理的方法,对吗?无论如何,SAS似乎在给我的变
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
当然,对于我的数据集中的每个观察,我都会得到相同的错误。为什么表中的区域值会有一堆空格(我想变量是$16),这是有道理的,但是为什么它会将所有的空格添加到我的变量名中呢?我错过了什么 这是由于
\n
变量的数字/字符转换造成的。当数值转换为字符时,它们是右对齐的
请尝试以下操作:
data _null_;
set zonelist;
call symputx(cats('zone',_n_), zone);
call symputx('numzones', _n_);
run;
cats
功能将执行数字/字符转换,并去除前导空格
如果您有SAS 9,那么您也可以使用symputX
函数从宏值中去除前导/尾随空格。我使用“压缩”解决了它,只需删除所有空格:
data _null_;
set zonelist;
call symputx(compress('zone',_n_), zone);
call symputx('numzones', _n_);
run;
然而,这并不能帮助我理解为什么我需要这么做。任何启示都将不胜感激 SAS有两种类型的变量,固定长度字符串和浮点数。让我们看看你的第一句话
call symput ('zone'||_n_, zone);
在这里,您引用了两个变量和一个字符串文本。由于|
运算符作用于字符变量,因此SAS需要将数字变量\n
隐式转换为字符串。SAS将使用best12.
格式,因此它将产生类似'1'
的值。因此,对于用于宏变量名的call symput()
函数,您将得到一个无效值
但是第三个值,变量区域
呢?如果zone是一个数字,则会发生相同的隐式转换,宏变量最终将包含前导空格。或者区域变量是一个字符串,在这种情况下,宏变量很可能会有尾随空格,除非区域值的长度恰好与变量区域定义为保持的最大长度匹配
正如其他人所建议的,要解决这个问题,有两件事要做
首先使用call symputx()
而不是call symput()
(除非您真的想在宏变量中存储这些尾随空格),它将自动strip()
输入值。它还将消除隐式数字到字符转换的注意事项
第二种方法是使用某种方法生成不插入空格的宏变量名。最简单的方法是只使用cats()
函数而不是|
操作符。但您也可以使用其他函数的组合,如put()
,compress()
,strip()
,等等
call symputx(cats('zone',_n_),zone);
嗯,这还是没用。查看日志,它似乎在“区域”的“区域”部分添加空白。我弄错了吗?如果我不是,那么“猫”或“脱衣舞”就不起作用了,因为空间在绳子的中间。我也试过脱衣舞(“区域”)之类的。我还没有找到一个解决办法,但一定是因为我不需要,而且我在这里遗漏了一些明显的东西?你怎么说它不起作用?你犯了什么错误?@Schwa,这应该行得通。请发布完整的日志。这不应该起作用:,其中
chars
被描述为“此列表中的字符已从源参数中删除”