我试图学习 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 列哈希数据集加载失败。
错误:数据步组件对象失败。在执行阶段中止。
大家有什么想法吗
非常感谢
您将在输出数据集的
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;
很抱歉在旧帖子下回答,但是如果 A 和 B 中的记录(对于某些键)超过 C 中的记录,会发生什么情况?