1

我想采用 Rick Wicklin 的宏(https://blogs.sas.com/content/iml/2015/10/05/random-integers-sas.html)生成随机数并将其转换为 FCMP 函数。FCMP 函数在使用%sysfunc(randbetween(1,100));或通过数据步骤调用时按预期工作,但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。视窗 10x64。

编辑: 当我将公式直接代入 SQL 语句时,它按预期工作,因此它似乎与对rand("uniform").

4

1 回答 1

0

我认为这是因为程序和数据步骤在 SAS 中生成了不同的环境。通常数据步骤中的函数和proc sql中的函数是不同的属性,即使它们具有相同的名称。一个例子是sum()函数。

在您的情况下,您也可以%sysfunc(randbetween(1,100))proc sql闭包中使用。

proc sql noprint;
  create table have as
  select %sysfunc(randbetween(1,100))
  from sashelp.class
  ;
quit;

这应该会给你预期的结果。

于 2018-02-08T08:17:23.633 回答