我想把Rick Wicklin的宏(https://blogs.sas.com/content/iml/2015/10/05/random-integers-sas.html)生成随机数并将其转换为FCMP函数。使用%sysfunc(randbetween(1,100));
或通过数据步骤调用时,FCMP函数按预期工作,但从proc sql
开始,它始终返回值1.
proc fcmp outlib=work.funcs.funcs;
function randbetween(min,max);
return ( min + floor( ( 1 + max - min ) * rand("uniform") ) );
endsub;
run;
工作示例:
data example;
do cnt=1 to 1000;
x = randbetween(1,100);
output;
end;
run;
破碎的SQL示例:
proc sql noprint;
create table have as
select randbetween(1,100)
from sashelp.class
;
quit;
这是一个错误吗?或者我误用了什么?
SAS版本是SAS9.4TS1M5。 Windows 10x64。
编辑:当我将公式直接替换为SQL语句时,它按预期工作,因此它似乎与rand("uniform")
的调用无关。
答案 0 :(得分:0)
我认为这是因为程序和数据步骤在SAS中生成了不同的环境。通常,proc sql中的数据步骤和函数中的函数是不同的属性,即使它们具有相同的名称。一个例子是sum()
函数。
在您的情况下,您还可以在 proc sql 闭包中使用%sysfunc(randbetween(1,100))
。
proc sql noprint;
create table have as
select %sysfunc(randbetween(1,100))
from sashelp.class
;
quit;
这应该会给你预期的结果。