【发布时间】:2013-10-02 08:10:50
【问题描述】:
我正在创建一个宏变量,但是当在我的 Proc 报告中使用相同的宏变量时,这个宏会在值前面生成一个空格
选择 COUNT(DISTINCT USUBJID) 到:N1 from DMDD where ARMN=1; 如何在相同的代码中纠正它??
【问题讨论】:
我正在创建一个宏变量,但是当在我的 Proc 报告中使用相同的宏变量时,这个宏会在值前面生成一个空格
选择 COUNT(DISTINCT USUBJID) 到:N1 from DMDD where ARMN=1; 如何在相同的代码中纠正它??
【问题讨论】:
Select trim(put(COUNT(DISTINCT USUBJID), 16. -L)) into: N1 from DMDD where ARMN=1;
使用 PUT() 使用 -L(左)对齐来格式化输出字符串。
【讨论】:
这实际上是 PROC SQL SELECT INTO 的“按设计工作”。虽然所有其他答案在某些方面都是正确的,但这是与普通宏变量相反的特殊情况,例如
%let var= 5 ;
%put [&var];
只会返回的地方
[5]
虽然这不是这样做的。这是PROC SQL SELECT INTO 的行为,是故意的。
这两条语句:
proc sql;
select name into :name from sashelp.class where name='Alfred';
select name into :shortname separated by ' ' from sashelp.class where name='Alfred';
quit;
%put `&name` `&shortname`;
是不相同的。 separated by ' '(或任何其他分隔符)将始终自动修剪,除非包含 notrim,如果您有 9.3 或更高版本,则有一个新选项 trimmed,如果您打算选择单个选项,则可以使用它多变的。我认为这种行为是在 9.2 中引入的(默认情况下,不修剪 select 而不用分隔符)。
如果您只选择一个值,添加separated by ' ' 不会对您的结果产生任何影响,只会导致发生修剪。
【讨论】:
这是因为任何宏变量都存储为字符。如果源数据是数字,则 SAS 使用 best12。格式转换为字符,因此结果用前导空格填充。我通过使用去除前导和尾随空格的 CATS 函数来解决这个问题。您不能使用 LEFT 或 STRIP 函数,因为它们仅适用于字符变量。
Select cats(COUNT(DISTINCT USUBJID)) into: N1 from DMDD where ARMN=1;
【讨论】: