【发布时间】:2021-03-03 07:13:01
【问题描述】:
我有大约 100 个大型数据集,我希望在每个数据集中提取不同的 ID 以垂直连接它们。数据集未排序,命名为 data_01 , data_02, data_03 ....data_100。
由于数据集都非常大,将它们放在一起而不减小大小是不可行的,运行数小时后连接甚至都没有移动。因此,我认为有必要在堆叠之前减少数据集,我在这里寻求一些帮助。
在通过 proc sql union 垂直连接所有数据集之前,我尝试创建一个宏来选择不同的 ID 并按 ID 对数值变量 cnt 求和。宏无法正常工作:
/*Get dataset names*/
proc sql noprint;
select memname into :mylist separated by ' '
from dictionary.tables where libname= "mylib" and upcase(memname) like "DATA_%"
;
quit;
%put &mylist;
/*create union statements*/
%global nextdata;
%let nextdata =;
%macro combinedata(mylist);
data _null_;
datanum = countw("&mylist");
call symput('Dataset', put(datanum, 10.));
run;
%do i = 1 %to &Dataset ;
data _null_;
temp = scan("&mylist", &i);
call symput("Dataname", strip(put(temp,$12.)));
run;
%put &Dataname;
%put &Dataset;
%if (&i=&Dataset) %then %do;
%let nextdata = &nextdata.
select id, sum(cnt)
from mylib.&&Dataname
group by id;
%end;
%else %do;
%let nextdata = &nextdata.
select id, sum(cnt)
from mylib.&&Dataname union
group by id;
%end;
%put nextdata = &nextdata;
%end;
%mend combinedata;
%combinedata(&mylist);
/*execute from proc sql*/
proc sql;
create table combined as (&nextdata);
quit;
我也尝试过使用 proc summary,但是没有足够的内存来运行以下代码:
data vneed / view=vneed;
set data_: (keep=id cnt);
run;
proc summary data=vneed nway;
class id;
var cnt;
output out=want (drop=_type_) sum=sumcnt;
run;
感谢任何帮助!
【问题讨论】:
-
每个数据集有多大?你有多少内存可用?
-
各个数据集是否已经按 ID 排序?或者如果没有排序,它们是否有 ID 索引?
-
@Tom 不,不幸的是它们没有按 ID 排序,否则我可以通过语句使用。 :(
-
ID是什么类型的变量?它包含多少不同的值?为什么不在 HASH 对象中构建数据?
-
@Tom ID 是数字,我不确定有多少不同的值,因为我从未成功堆叠所有数据集。会不会是 ID 是数字导致 proc 摘要内存不足?