【发布时间】:2014-06-05 08:38:05
【问题描述】:
关于如何修改下面的问题代码行以正确命名我的数据集的任何建议?
我有一个数据集,我想将处理公司 (4400) 与 48 个行业和 14 年的大约 100,000 家控制公司进行匹配,然后是最接近的规模而不进行替换。我下面的方法可能有点笨拙,但我正在学习。我将处理和控制数据集分成 48x14 组,(之后我将尝试通过某种类型的循环运行最接近的匹配而无需替换代码)。
我已经使用以下哈希码的变体来制作 48 个数据集 out1...out48。现在,我正在尝试通过使用以下代码将这 48 个数据集中的每一个进一步细分为 14 年。我收到一条错误数据集创建行,我正在尝试创建名为 out12004、out22004、out32004 的 48x14 数据集。 . .out482013
问题代码行(大约是下面代码的 2/3):hh.output (dataset: 'out'||&i||put(year, best.-L)) ;
SAS 错误如下所示:
错误:值 OUT 12004 不是有效的 SAS 名称。
错误:“DATASTEP.HASH”的实例方法 OM_OUTPUT(505) 期间发生错误。
这是完整的代码(修改自 Is it possible to loop over SAS datasets? 和SUGI30 paper 236-30
%MACRO process_datasets(mdataset);
data &mdataset.;
set &mdataset.;
data _null_ ;
dcl hash hoh (ordered: 'a') ;
dcl hiter hih ('hoh' ) ;
hoh.definekey ('year' ) ;
hoh.definedata ('year', 'hh' ) ;
hoh.definedone () ;
dcl hash hh () ;
do _n_ = 1 by 1 until ( eof ) ;
set out&i. end = eof ;
if hoh.find () ne 0 then do ;
hh = _new_ hash (ordered: 'a') ;
hh.definekey ('industry','cik', 'year', '_n_') ;
hh.definedata ('industry','cik','year','eventdat', 'at', 'roa') ;
hh.definedone () ;
hoh.replace () ;
end ;
hh.replace() ;
end ;
do rc = hih.next () by 0 while ( rc = 0 ) ;
hh.output (dataset: '_'||&i||put(year, best.-L)) ;
rc = hih.next() ;
end ;
stop ;
run;
data _null_;
file 'tmp.csv' mod dsd dlm=','; *saving everything to the same file;
set &mdataset.;
put (_all_) (+0);
run;
%MEND process_datasets;
%MACRO loop_through_all;
%DO i = 1 %to 48;
%process_datasets(out&i.);
%END;
%MEND loop_through_all;
【问题讨论】:
标签: hash dataset sas nested-loops