Hash SAS哈希对象:多数据合并

Hash SAS哈希对象:多数据合并,hash,sas,Hash,Sas,我不熟悉散列对象,但我想了解更多关于它们的信息。我正试图找到一种方法,尽可能用哈希替换所有可能的proc-sql和常规合并。在使用SASHELP数据集时,我遇到了以下问题: 假设我有一个包含10个独特观察值(汽车制造商)的数据集,我想将它与另一个包含这些汽车各种型号的表进行匹配,因此汽车在该表中重复。另一个需要注意的重要方面是,并非所有的汽车品牌都出现在我正在查找的表格中,但我仍然希望保留在我的表格中 考虑以下代码: proc sql noprint; create table x as

我不熟悉散列对象,但我想了解更多关于它们的信息。我正试图找到一种方法,尽可能用哈希替换所有可能的proc-sql和常规合并。在使用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中的所有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(他是最初的散列者之一)。