我想创建一个使用哈希的函数。正在散列的表有3列:年龄,性别,a。我想通过以下方式使用宏:
在数据步骤之前定义宏:
%macro hashfind(age, sex) ;
rc=tab.find(key: &age, key: &sex );
%LET p=a ;
%PUT p;
%mend;
打开数据步骤, 将哈希定义如下:
if _n_=1 then
do;
declare hash tab();
rc=tab.definekey('Age');
rc=tab.definekey('Sex');
rc=tab.definedata('a');
rc=tab.definedone();
do until (eof1);
set work.tab end=eof1;
rc=tab.add();
put rc;
end;
end;
按以下方式在数据步骤中使用宏:
abc=%hashfind(30, 'M') ;
总结一下:如何在宏内部使用整个哈希? (我将来会扩展宏,所以它是必要的。)
或者:有没有人知道如何定义一个以我喜欢的方式使用哈希的函数?使用PROC FCMP不是一种选择,因为PROC FCMP定义的功能中的散列在我使用的SAS 7.1中不可用。
答案 0 :(得分:1)
如果您将您的广告称为%hashfind(30,'M')
而不是abc=%hashfind(30,'M');
,那么它应该有用。
当您以第二种方式调用它时,您的SAS DATA步骤代码变为abc=rc=tab.find(key: 30, key: 'M');
这是有效代码,并将1指定为abc的值,因为rc可能从add()得到值1并且find()返回1(假设找到了密钥)。
如果要指定数据步骤变量的名称来保存返回代码,在这种简单的情况下,您可以将宏定义更改为:
%macro hashfind(age, sex) ;
tab.find(key: &age, key: &sex )
%mend;
我最后删除了rc =和分号。这使它更像功能。
然后,您可以调用abc=%hashfind(30,'M');
我跳过讨论你的宏%let和%put语句,因为我不确定你要用它们做什么。
答案 1 :(得分:0)
我创建了这个宏,使代码更加用户友好。它的编写方式只将已找到的变量放在日志中,但修改它应该相当容易。
宏有4个参数:键,要查找的变量,输入数据集以及要查找的值。
%macro hashfind(byvars, findvars, inset, find);
%let data_key = %trim(&byvars);
%let data_key = %sysfunc(tranwrd(&data_key,%str( ), %str(",")));
%let findvars = %trim(&findvars);
data _NULL_;
if 0 then set &inset;
if _N_ = 1 then do;
declare hash tab(dataset: "&inset.");
rc = tab.DefineKey ("&data_key.");
rc = tab.DefineData ("&findvars.");
rc = tab.DefineDone ();
end;
&byvars = "&find.";
rc = tab.find();
put &findvars=;
run;
%mend;
然后可以按如下方式调用宏:
%hashfind(key1 key2 key3 etc, var, dataset, value);
这可能会给你一个良好的开端,希望它有所帮助。