我正在创建一个宏变量,但是当在我的 Proc 报告中使用相同的宏变量时,这个宏会在值前面生成一个空格
选择 COUNT(DISTINCT USUBJID) 到:N1 from DMDD where ARMN=1; 如何在相同的代码中纠正它?
对于 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 中引入的(默认情况下,选择不修剪不带分隔符)。
如果您只选择一个值,则添加separated by ' '
不会影响您的结果,只会导致修剪发生。
这是因为任何宏变量都存储为字符。如果源数据是数字,则 SAS 使用 best12。格式转换为字符,因此结果用前导空格填充。我通过使用去除前导和尾随空格的 CATS 函数来解决这个问题。您不能使用 LEFT 或 STRIP 函数,因为它们仅适用于字符变量。
Select cats(COUNT(DISTINCT USUBJID)) into: N1 from DMDD where ARMN=1;
使用%cmpres()
宏删除空白。
Select trim(put(COUNT(DISTINCT USUBJID), 16. -L)) into: N1 from DMDD where ARMN=1;
使用 PUT() 使用 -L(左)对齐来格式化输出字符串。