SAS:如何使用另一个数据集自动创建许多数据集

时间:2017-04-28 20:42:20

标签: sas sas-macro

我希望从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

2 个答案:

答案 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;