【问题标题】:Pass argument to a SAS function using a SAS variable使用 SAS 变量将参数传递给 SAS 函数
【发布时间】:2014-07-01 22:33:10
【问题描述】:

我想计算 SAS 变量列表的最大值,其中列表由数据集中存在的另一个变量确定。也就是说,

| var_1 | var_2 | var_3 | var_4 | maximum till | formula used         | var_output |
|-------|-------|-------|-------|--------------|----------------------|------------|
| 3     | 6     | 9     | 12    | 4            | =max(of var_1-var_4) | 12         |
| 1     | 10    | 100   | 1000  | 2            | =max(of var_1-var_2) | 10         |
| 5     | 15    | 25    | 35    | 3            | =max(of var_1-var_3) | 25         |

感谢任何帮助。谢谢:)

【问题讨论】:

    标签: arrays function sas


    【解决方案1】:

    使用 do 循环和滚动最大值:

    data want;
        set have;
        array vars{4} var1-var4;
        do i = 1 to max_till;
            var_out = max(vars{i},var_out);
        end;
    run;
    

    【讨论】:

      【解决方案2】:

      FCMP 解决方案。这类似于 user667489 的解决方案,但实现为函数。这仅适用于 9.4,并且可能仅适用于 9.4 TS1M0+。

      data have;                       *some data;
      input var1-var4 varmax;
      datalines;
      3 6 9 12 4
      1 10 100 1000 2
      5 15 25 35 3
      ;;;;
      run;
      
      proc fcmp outlib=work.funcs.func; *store functions here;
      function maxof(mxarr[*],maxlim);  *returns numeric;
          do _i = 1 to maxlim;
            _max = max(mxarr[_i],_max);
          end;
          return(_max);
      endsub;
      run;
      
      options cmplib=work.funcs;        *define where functions come from;    
      data want;
      set have;
      array vars var1-var4;
      varout = maxof(vars,varmax);      *use function (pass array by reference);
      run;
      

      【讨论】:

      • 因为在 9.3 中非临时数组不能作为参数传递给函数。
      猜你喜欢
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      相关资源
      最近更新 更多