我是哈希对象的新手,但我想了解更多关于它们的信息。我试图找到方法替换所有可能的proc sql和常规合并与hash尽可能。在使用SASHELP数据集时,我遇到了以下问题:
假设我有10个独特观察数据集(汽车制造商),我想将其与包含这些汽车的各种型号的另一个表格相匹配,因此汽车在该表格中重复进行。需要注意的另一个重要方面是,并非所有汽车制造都出现在我正在查找的表格中,但我仍然希望保留在我的表格中。
请考虑以下代码:
proc sql noprint;
create table x as select distinct make
from sashelp.cars;
quit;
data x;
set x (obs = 10);
if make = "GMC" then make = "XYZ";
run;
data hx (drop = rc);
if 0 then set sashelp.cars(keep = make model);
if _n_ = 1 then do;
declare hash hhh(dataset: 'sashelp.cars(keep = make model)', multidata:'y');
hhh.DefineKey('make');
hhh.DefineData('model');
hhh.DefineDone();
end;
set x;
rc = hhh.find();
do while(rc = 0);
output;
rc = hhh.find_next();
end;
if rc ne 0 then do;
call missing(model);
output;
end;
run;
如果表格X中的所有内容也在桌面车中,那么在output
之后删除call missing(model)
命令将完全符合我的要求。但我也想确保将“XYZ”保留在表格中。
但现有代码在找到所有匹配模型后会产生空白,如下所示:
make model
==========
Acura MDX
Acura RSX Type S 2dr
Acura TSX 4dr
... (skipping a few rows)
Acura NSX coupe 2dr manual S
Acura
Audi A4 1.8T 4dr
如您所见,在上表中,倒数第二行中缺少模型。这种模式出现在每个品牌的最后。
有关如何解决此问题的任何建议都将受到高度赞赏!
非常感谢
答案 0 :(得分:2)
直接回答:你需要考虑这一部分。
rc = hhh.find();
do while(rc = 0);
output;
rc = hhh.find_next();
end;
if rc ne 0 then do;
call missing(model);
output;
end;
这里发生的事情是你一再试图找到下一个,很好,直到你失败。好的。现在你处于rc ne 0
状态,即使你真的意味着最后一步只能在你找不到的时候使用。
您可以通过以下两种方式处理此问题。你可以这样做:
rc = hhh.find();
if rc ne 0 then do;
call missing(model);
output;
end;
else
do while(rc = 0);
output;
rc = hhh.find_next();
end;
或者,您可以在do while循环中添加一个计数器,然后在该计数器存储0时执行调用missing / output。上述内容可能更容易。
此外,您可能应该考虑哈希是否是解决此问题的正确方法。虽然可以通过多数据哈希来解决这个问题,但对于类似的东西,键控集通常更有效,并且更容易编码。