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

SAS: How to Automate the Creation of Many Datasets using Another Data set

我希望从 city_variables 数据集创建多个数据集。我总共有 58 个观察结果汇总到宏变量 (&count) 中以停止 do 循环。

city_variables 数据集看起来像(当然是垂直的):

CITY_NAME
City1
City2
City3
City4
City5
City6
City7
City8
City9
City10

........

City58

我从数据 null 语句创建了宏变量 &name,以便将城市名称输入到数据集名称中。

任何关于如何按名称(而不是数字)自动创建 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

好吧,如果你打算这样做

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.;

我将 link 提供的其他一些选项:

Chris Hemedinger @ SAS Dummy 博客 How to Split One Data Set Into Many 展示了类似的概念,只是他没有把宏包装器放在我做的地方。

Paul Dorfman,Data Step Hash Objects as Programming Tools 是关于使用散列 table 执行此操作的开创性论文。如果您了解散列 tables 并且有可用内存,这可能是 "fastest" 执行此操作的方法。

您不需要使用宏以这种方式自动拆分数据。由于您的示例非常简单,我会考虑在空数据步骤中使用 call execute

data test;
    infile datalines ;
    input city_name .;
    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;