在我声明一个数组之后,我想重置其余代码的值。
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
函数)。该函数将用于许多列但具有不同的截止值,我不想为每一列创建一个数组繁琐。
答案 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;