在SAS中重命名HASH合并中的变量

时间:2018-04-05 13:02:37

标签: hash merge sas rename

我试图在SAS中学习HASH连接但是我坚持使用具有相同变量名的多个表的情况(不是键,没关系,但是其他变量)

我想连接表A,B和C,每个表有两个变量Key和Dat。名称Key和Dat在所有三个

中都很常见

如果我事先将所有三个表中的Dat重命名为DAT_A,DAT_B,DAT_C,那么这种语法对我有用,但由于我必须调用所有需要时间的三个表而无法实现目的

此代码有效:

data merged(keep=KEY DAT_A DAT_B DAT_C);
if 0 then
    set A B C;

if _N_ = 1 then
    do;
        declare hash A(dataset:'A');
        A.defineKey('KEY');
        A.defineData('DAT_A');
        A.defineDone();
        declare hash B(dataset:'B');
        B.defineKey('KEY');
        B.defineData('DAT_B');
        B.defineDone();
    end;

set C;

if A.find(key:KEY) = 0 and B.find(key:KEY) = 0 then
    output; run;

在SAS网站上提到你可以在哈希声明中指定数据中的选项,所以我认为这可能有效

data merged(keep=KEY DAT_A DAT_B DAT_C DAT);
if 0 then
    set A B C;

if _N_ = 1 then
    do;
        declare hash A(dataset:'A (rename=(DAT=DAT_A))');
        A.defineKey('KEY');
        A.defineData('DAT_A');
        A.defineDone();
        declare hash B(dataset:'B (rename=(DAT=DAT_B))');
        B.defineKey('KEY');
        B.defineData('DAT_B');
        B.defineDone();
    end;

set C (rename=(DAT=DAT_C));

if A.find(key:KEY) = 0 and B.find(key:KEY) = 0 then
    output; run;

但运行此操作会出现以下错误

  

错误:变量DAT不在文件WORK.A。

上      

错误:第33行第4行的哈希数据集加载失败。

     

错误:数据步骤组件对象失败。在执行阶段中止。

有没有人有任何想法

非常感谢

1 个答案:

答案 0 :(得分:2)

您在输出数据集的DAT数据集选项中包含keep=。但是您的数据步骤不再具有变量DAT。您已重命名它的所有副本。

您的数据集A没有DAT的错误消息可能是因为您之前尝试将变量重命名为DAT_A

以下是使用SASHELP.CLASS的示例。

data merged ;
keep NAME AGE_A AGE_B AGE_C ;
if 0 then set
  sashelp.class(rename=(AGE=AGE_A))
  sashelp.class(rename=(AGE=AGE_B))
  sashelp.class(rename=(AGE=AGE_C))
;

if _N_ = 1 then do;
  declare hash A(dataset:'sashelp.class (rename=(AGE=AGE_A) where=(age_a ne 14))');
  A.defineKey('NAME');
  A.defineData('AGE_A');
  A.defineDone();
  declare hash B(dataset:'sashelp.class (rename=(AGE=AGE_B) where=(age_b ne 13))');
  B.defineKey('NAME');
  B.defineData('AGE_B');
  B.defineDone();
end;

set sashelp.class (rename=(AGE=AGE_C));

/* if A.find(key:NAME) = 0 and B.find(key:NAME) = 0 then output; */
if A.find(key:NAME) then call missing(age_a);
if B.find(key:NAME) then call missing(age_b);

run;