在SAS中重置临时阵列

时间:2017-11-27 11:42:52

标签: arrays sas

在我声明一个数组之后,我想重置其余代码的值。

array cutoffs[4] _temporary_ (1 2 3 4); /*works well*/
... use of the array
array cutoffs[3] _temporary_ (3.5 5 7.5); /*Error*/
... use of the updated array

错误如下:

  

错误124-185:已经定义了变量截止值。

这个错误非常清楚,但我想知道如何在不更改名称的情况下重新分配数组(这将是最乏味的)。

我尝试了一些语法,但我自己找不到,我在google上看到没有资源,也没有在stackoverflow上看到。

我该怎么做?

编辑:主要目的是我创建了一个函数(带proc fcmp),它将数组作为参数并剪切值(如R的cut函数)。该函数将用于许多列但具有不同的截止值,我不想为每一列创建一个数组繁琐。

2 个答案:

答案 0 :(得分:1)

以下是FCMP功能的宏版本:

%macro cut2string(var,cutoffs,values);
%if &var. lt %scan(&cutoffs.,1,%str( )) %then "%scan(&values.,1,%str( ))";
%else %if &var. ge %scan(&cutoffs.,-1,%str( )) %then "%scan(&values.,-1,%str( ))";
%else %do i=1 %to %sysfunc(countw(&cutoffs.,%str( )));
    %if &var. ge %scan(&cutoffs.,&i.,%str( )) and &var. lt %scan(&cutoffs.,%eval(&i.+1),%str( )) %then "%scan(&values.,%eval(&i.+1),%str( ))";
%end;
%mend;

以下是您使用与链接页面中使用的相同示例来调用它的方法:

data Work.nonsales2;
    /*set Work.nonsales;*/
    salary_string  = %cut2string(30000, 20000 100000 500000, <20k 20k-100k 100k-500k >500k);
run;

您可以使用关键字参数代替位置来使您的呼叫更加清晰:

%macro cut2string(var=,cutoffs=,values=);
...
salary_string  = %cut2string(var=30000,cutoffs=20000 100000 500000,values=<20k 20k-100k 100k-500k >500k);

但是现在我看到了代码,这应该是SAS中的一种格式:

proc format;
  values cutoffs
    low-<20000='<20k'
    20000-<100000='20k-100k'
    100000-<500000='100k-500k'
    500000-high='>500k'
    ;
run;
data work.nonsales2
  salarystrings=put(30000,cutoffs.);
run;

答案 1 :(得分:0)

您可以逐个更改cutoffs数组的值。

array cutoffs{4} _temporary_ (1 2 3 4); /*works well*/
... use of the array
cutoffs[1]=3.5;
cutoffs{2}=5;
cutoffs{3}=7.5;
cutoffs{4}=.;

或者你可以第二次使用另一个名字作为数组。

话虽如此,你使用它的方式似乎有点奇怪。

编辑:您可以考虑重写您的proc fcmp函数以期望值列表作为字符串(例如'3.5,5,7.5')而不是数组,并完全取消数组。

您的proc fcmp会改变

do i=1 to dim(array);
  val=array{i};
  ...
end;
等等;

do i=1 to countw(array,',');
  val=input(scan(array,i,','),best32.);
  ...
end;