声明向量作为SAS函数的参数

时间:2017-11-22 14:43:37

标签: vector sas cut

我目前正在学习SAS,已经知道R和其他编程语言,我对如何声明向量感到困惑。

我创建了一个模仿R cut函数的小函数:

proc fcmp outlib=sasuser.funcs.trial;
function cut(var, cutoff1, cutoff2, cutoff3, value1, value2, value3, value4);
    if  var<cutoff1 then x=value1;
    if  var>=cutoff1 & var<cutoff2 then x=value2;
    if  var>=cutoff2 & var<cutoff3 then x=value3;
    if  var>=cutoff3 then x=value4;
    return (x);
endsub;
CUTTED_COL = cut(NOT_CUTTED_COL, 3.5, 5, 7.5, 0, 0.5, 1, 2);

该功能完美无缺,但与这些参数有关。这里,var是数据集中的一列,我将用它来创建另一列。

要进入下一步,我想将参数添加为R中名为vectors的参数。我认为vectors在SAS中被命名为arrays但我不是确定它的结构完全相同。

proc fcmp outlib=sasuser.funcs.trial;
function cut2(var, cutoffs, values);
    /*loop over vectors with a do*/;
    return (x);
endsub;
CUTTED_COL = cut(NOT_CUTTED_COL, {3.5, 5, 7.5}, {0, 0.5, 1, 2});

当然这种语法失败了。我怎样才能正确写出来?

注意:即使有比自定义函数更好的方法(我尝试了proc格式,但它不是我正在寻找的),对于向量和函数的真正问题的答案也非常受欢迎目的。
NB2:如果答案是RTFM,我想知道哪个部分

最后:这是我使用DomPazz代码(link)编写的cut函数。像魅力一样。

2 个答案:

答案 0 :(得分:2)

DomPazz已经发布了如何将数组传递给FCMP函数的答案。但是你的问题看起来像你应该用格式解决的东西。如果你定义这样的格式。

proc format ;
  value cut 
   low -< 3.5 = '0'
   3.5 -< 5 = '0.5'
   5 -< 7.5 = '1'
   7.5 - high = '2'
  ;
run;

然后您可以使用它来创建新变量。

cut2 = input(put(not_cut,cut.),32.);

以下是基于格式的解决方案和基于公式的解决方案的实用示例。

data want ;
  array cutoff (3) _temporary_ (3.5 5 7.5);
  array outcome (4) _temporary_ (0 0.5 1 2);
  input not_cut @@ ;
  do i=1 to dim(cutoff) until (not_cut < cutoff(i));
  end;
  cut=outcome(i);
  cut2 = input(put(not_cut,cut.),32.);
cards;
1 3.5 4 5 6 7.5 8
;

输出;

Obs    not_cut    i    cut    cut2

 1       1.0      1    0.0     0.0
 2       3.5      2    0.5     0.5
 3       4.0      2    0.5     0.5
 4       5.0      3    1.0     1.0
 5       6.0      3    1.0     1.0
 6       7.5      4    2.0     2.0
 7       8.0      4    2.0     2.0

答案 1 :(得分:1)

您可以将参数声明为数组(向量)。试试这个:

options cmplib=work.fns;

proc fcmp outlib=work.fns.test;
function cut2(var, cutoffs[*], values[*]);
   put var=;
   put cutoffs=;
   put values=;
   return (1);
endsub;
run;

data _null_;
   array cutoffs[3] (1 2 3);
   array values[3] (4 5 6);

    x = cut2(1,cutoffs,values);
run;

这将以下内容放入SAS日志中:

96   data _null_;
97   array cutoffs[3] (1 2 3);
98   array values[3] (4 5 6);
99
100  x = cut2(1,cutoffs,values);
101  run;

var=1
cutoffs[1]=1 cutoffs[2]=2 cutoffs[3]=3
values[1]=4 values[2]=5 values[3]=6