我希望从city_variables数据集创建多个数据集。总共有58个观察结果我总结为宏变量(& count)来停止do循环。
city_variables数据集看起来像(垂直的):
CITY_NAME
City1
City2
City3
City4
City5
City6
City7
City8
City9
City10
..........
City58
我从数据 null 语句创建了macrovariable& name,以便将cityname输入到数据集名称中。
如何通过名称(而不是数字)自动创建48个文件,任何帮助都会很棒。再次感谢。
/ 在协调文件中创建具有观察次数的宏 /
proc sql;
select count(area_name);
into :count
from main.state_all;
quit;
%macro repeat;
data _null_;
set city_variables;
%do i= 1 %UNTIL (i = &count);
call symput('name',CITY_NAME);
run;
data &name;
set dataset;
where city_name = &name;
run;
%end;
%mend repeat;
%repeat
答案 0 :(得分:1)
好吧,如果你要去做
proc sql;
select count(area_name);
into :count
from main.state_all;
quit;
那么为什么不一直走?在给定条件作为参数的情况下,创建一个执行一个数据集输出的宏,然后为每个单独的名称进行一次调用。这可能接近你所看到的。
%macro make_data(data_name=, set_name=, where=);
data &data_name.;
set &set_name.;
where &where.;
run;
%mend make_data;
proc sql;
select
cats('%make_data(data_name=',city_name,
', set_name=dataset, where=city_name="',
city_name,
'" )')
into :make_datalist
separated by ' '
from main.state_all;
quit;
&make_datalist.;
我将链接到的其他一些选项:
Chris Hemedinger @ SAS Dummy博客How to Split One Data Set Into Many显示了一个类似的概念,除了他没有把宏包装器放在我做的地方。
Paul Dorfman,Data Step Hash Objects as Programming Tools是关于使用哈希表来执行此操作的开创性论文。如果您了解哈希表并且可以使用内存,这可能是“最快”的方法。
答案 1 :(得分:0)
您无需使用宏来以这种方式自动拆分数据。由于您的示例非常简单,我会考虑在空数据步骤中使用call execute
:
data test;
infile datalines ;
input city_name $20.;
datalines;
City1
City2
City2
City3
City3
City3
;
run;
data _null_;
set test;
call execute("data "||strip(city_name)||";"||"
set test;
where city_name = '"||strip(city_name)||"';"||"
run;");
run;