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