Hash SAS哈希对象:多数据合并
我不熟悉散列对象,但我想了解更多关于它们的信息。我正试图找到一种方法,尽可能用哈希替换所有可能的proc-sql和常规合并。在使用SASHELP数据集时,我遇到了以下问题: 假设我有一个包含10个独特观察值(汽车制造商)的数据集,我想将它与另一个包含这些汽车各种型号的表进行匹配,因此汽车在该表中重复。另一个需要注意的重要方面是,并非所有的汽车品牌都出现在我正在查找的表格中,但我仍然希望保留在我的表格中 考虑以下代码:Hash SAS哈希对象:多数据合并,hash,sas,Hash,Sas,我不熟悉散列对象,但我想了解更多关于它们的信息。我正试图找到一种方法,尽可能用哈希替换所有可能的proc-sql和常规合并。在使用SASHELP数据集时,我遇到了以下问题: 假设我有一个包含10个独特观察值(汽车制造商)的数据集,我想将它与另一个包含这些汽车各种型号的表进行匹配,因此汽车在该表中重复。另一个需要注意的重要方面是,并非所有的汽车品牌都出现在我正在查找的表格中,但我仍然希望保留在我的表格中 考虑以下代码: proc sql noprint; create table x as
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中的所有make也在表cars中,那么在调用missing(model)
之后删除output
命令将完全符合我的要求。但我还想确保make“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
如您所见,在上表中,从第二行到最后一行缺少一个模型。此图案出现在每个品牌的末尾
任何关于如何解决此问题的建议都将不胜感激
直接感谢你的回答:你需要考虑这一部分。
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。上述方法可能更简单
进一步,您可能应该考虑哈希是否是这个问题的正确解决方案。虽然可以用多数据散列来解决这一问题,但键控集通常对此类问题更为有效,并且更易于编码。
谢谢Joe,非常感谢您的回答。你是对的,散列可能不是正确的解决方案,我想我只是想知道如何使用散列来替代这些操作。散列对象确实很有趣,有时它当然是更好的选择。如果你得到SAS-L邮件列表,你会经常看到关于做不同事情的最佳方式的有趣讨论,包括Paul Dorfman(他是最初的散列者之一)。