散列返回整个表-SAS
我在数据步骤中使用了一个哈希查询,如下所示:散列返回整个表-SAS,sas,Sas,我在数据步骤中使用了一个哈希查询,如下所示: if _n_ = 1 then do; if 0 then set TableA; declare hash A(dataset: "TableA"); A.definekey ("UniqueKeyA" ); A.definedata ("DataA" ); A.definedone(); end; if _n_ = 1 then do; if 0 then se
if _n_ = 1 then do;
if 0 then
set TableA;
declare hash A(dataset: "TableA");
A.definekey ("UniqueKeyA" );
A.definedata ("DataA" );
A.definedone();
end;
if _n_ = 1 then do;
if 0 then
set TableB;
declare hash B(dataset: "TableB");
B.definekey ("UniqueKeyB" );
B.definedata ("DataB" );
B.definedone();
end;
rcA = A.find(key:UniqueKeyA);
rcB = B.find(key:UniqueKeyB);
当我运行查询时,TableA
返回rcA
和预期的数据,但是由于某种原因,TableB
的散列会将TableB
中的每一列都带到一起。这些查询在我看来是相同的,我想不出表之间有什么本质上的不同会导致它们的行为不同,但我对SAS了解不多
如果我的原始表是
UniqueKeyA UniqueKeyB
1 A
2 B
3 C
而TableA是
UniqueKeyA [...Other TableA columns...] DataA
1 53
3 ... 46
表B是
UniqueKeyB [...Other TableB columns...] DataB
B .45
C ... .22
我的结果表是
UniqueKeyA UniqueKeyB rcA DataA rcB [...Other TableB columns...] DataB
1 A 0 53 21
2 B 513 0 .45
3 C 0 46 0 ... .22
这对我来说没有意义,因为散列看起来非常基本,虽然它们是相同的,但它们中只有一个返回每一列
如果您需要更多信息,请告诉我,谢谢
此外,我还有另一个问题,关于将值输入数据列的相同散列,即使,rcA
不等于0。这个问题在这里:这一行:
if 0 then
set TableB;
就是这些列的来源。这是一种“懒惰”的方法,可以避免在散列创建之前没有对变量进行技术初始化的情况下,从散列创建中出现未初始化的变量消息。如果你把每个变量都带进来就可以了,但是如果你只带了2个变量,而你有40个变量,那么你就得到了38个你不太想要的额外变量。它们是空的,但仍然不需要
将
(keep=uniquekey-datab)
添加到set TableB语句中,它应该可以去掉那些其他列。太棒了,谢谢!是否有任何原因,它可能会这样做,只有一个表?创建哈希或调用find方法的顺序并没有改变它始终是TableB的事实。不过这很有帮助——我不是一个SAS用户,我正在修改别人的代码,我会把它改成你不那么懒惰的方式。有时候SAS中的散列对象表现得很奇怪。有一次,我在同一个数据步骤中遇到了两个哈希问题。他们的名字有点像hname1和hname2,所以他们名字中只有最后的符号是不同的。每次我运行这个程序,我都会收到一个错误,不是通常的错误,有合理的描述,但类似“内存不足……诸如此类……出现了错误……任务回溯……诸如此类”。当我给他们起的名字差别更大时,一切都很理想!所以,我只是想一想——试着给你的散列取一个比a和B更长的名字。听起来很奇怪,但谁知道呢:)听起来很糟糕!我的代码中的实际表有更多不同的名称,但知道散列对象有时可能表现得很奇怪是很有用的。@AndyPhillips,很可能表中没有任何额外的变量。如果不是这样,tableA也会这样做。@Joe tableA实际上有许多列,而不是散列中引用的列。这也是造成这种情况如此混乱的部分原因——它只发生在一个表中,而不是另一个表中,但语句基本上是相同的。