Jim*_*ier 4 concatenation sas dataset
我有超过20万个小数据集,它们具有相同的变量(n <1000,通常n <100),我想连接到主数据集.我已经尝试使用一个宏来使用数据步骤来迭代所有新数据集并使用"set master new:"与master连接,但这需要很长时间.此外,如果我尝试同时运行,则调用执行数据步骤表示我在一个巨大的服务器盒上内存不足.作为参考,所有小数据集一起只有5个Gigs.任何建议将不胜感激.这是我到目前为止:
%macro catDat(name, nbr) ;
/*call in new dataset */
data new ;
set libin.&name ;
run ;
/* reorder names */
proc sql noprint;
create table new as
select var1, var2, var3
from new;
quit;
%if &nbr = 1 %then %do ;
data master;
set new;
run;
%end;
%if &nbr > 1 %then %do ;
data master;
set master new ;
run;
%end ;
%mend;
/* concatenate datasets */
data runthis ;
set datasetNames ;
call execute('%catdat('||datasetname||','||_n_||')');
run;
Run Code Online (Sandbox Code Playgroud)
已解决:请参阅下面的Bob的评论.
Bel*_*Bob 10
尝试使用PROC APPEND而不是"新"数据集; 会更快,更快:
%macro DOIT;
proc sql noprint;
select count(*) into : num_recs
from datasetNames;
quit;
%do i=1 %to &num_recs;
data _null_;
i = &i;
set datasetNames point=i;
call symput('ds_name',datasetname);
stop;
run; /* UPDATE: added this line */
%if &i = 1 %then %do;
/* Initialize MASTER with variables in the order you wish */
data master(keep=var1 var2 var3);
retain var1 var2 var3;
set libin.&ds_name;
stop;
run;
%end;
proc append base=master data=libin.&ds_name(keep=var1 var2 var3);
run;
%end;
%mend DOIT;
Run Code Online (Sandbox Code Playgroud)
PROC APPEND将每个数据集添加到新的"主"中,而不是每次都像现在这样重建它.这也避免了使用CALL EXECUTE,删除了您遇到的内存问题(由于在执行堆栈中生成了如此多的代码而引起).
| 归档时间: |
|
| 查看次数: |
3044 次 |
| 最近记录: |