sas数据步骤中的哈希对象澄清

时间:2015-09-23 09:17:26

标签: hash sas

我正在 sas 学习哈希对象,我想跟踪销售业绩和目标之间的差异。我将id,qtrnum和amt属于销售额。

销售数据集如下:

data contrib;
    input id $ qtrnum $ amt;
    datalines;
a001 atr1 12
a001 atr2 13
a002 atr1 11
a002 atr2 18
;
run;

并且目标位于哈希对象中:

data difference (drop = amt2);
    length amt2 8;
    if _n_ = 1 then do;
        declare hash goal();
        goal.definekey("Qtrnum");
        goal.definedata("Amt2");
        goal.definedone();
        call missing(qtrnum, amt2);
        goal.add(key:'atr1', data:9);
        goal.add(key:'atr2', data:13);
    end;
    set contrib;
    goal.find();
    diff = amt - amt2;
run;

虽然它给出了错误:

  

错误:变量qtrnum已被定义为字符和数字。

请取悦我。非常感谢。

2 个答案:

答案 0 :(得分:2)

SAS将在第一次引用变量时创建变量。在你的程序中,第一次引用QTRNUM就在这一行。

   goal.definekey("Qtrnum");

SAS无法判断QTRNUM是数字还是字符,因此它使其成为数字。这就是为什么在许多使用散列对象的DATA步骤中,数据步骤的顶部会有这样的行。

if 0 then set contrib;

由于0为假,因此从不执行SET语句,但在编译数据步骤期间,SAS将定义CONTRIB中的所有变量。

答案 1 :(得分:0)

也明确定义Qtrnum变量。

length Qtrnum $8;

或者可能看起来像:

data difference (drop = amt2);
length amt2 8 Qtrnum$8;
if _n_ = 1 then do;
    declare hash goal();
    goal.definekey("Qtrnum");
    goal.definedata("Amt2");
    goal.definedone();
    call missing(qtrnum, amt2);
    goal.add(key:'atr1', data:9);
    goal.add(key:'atr2', data:13);
end;
set contrib;
goal.find();
diff = amt - amt2;
run;