SAS哈希对象:多数据合并

时间:2014-09-06 02:32:37

标签: hash sas

我是哈希对象的新手,但我想了解更多关于它们的信息。我试图找到方法替换所有可能的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

如您所见,在上表中,倒数第二行中缺少模型。这种模式出现在每个品牌的最后。

有关如何解决此问题的任何建议都将受到高度赞赏!

非常感谢

1 个答案:

答案 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。上述内容可能更容易。

此外,您可能应该考虑哈希是否是解决此问题的正确方法。虽然可以通过多数据哈希来解决这个问题,但对于类似的东西,键控集通常更有效,并且更容易编码。