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

问题描述 投票:0回答:2

我试图学习 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 列哈希数据集加载失败。

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

大家有什么想法吗

非常感谢

hash merge sas rename
2个回答
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;

0
投票

很抱歉在旧帖子下回答,但是如果 A 和 B 中的记录(对于某些键)超过 C 中的记录,会发生什么情况?

© www.soinside.com 2019 - 2024. All rights reserved.