我试图在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行的哈希数据集加载失败。
错误:数据步骤组件对象失败。在执行阶段中止。
有没有人有任何想法
非常感谢
答案 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;