SAS创建按年份排序的子表
我在SAS中有一个表,其中包含来自证券交易所的数据。其中一列包含有关日期的信息。我想创建子表,每个子表只保存一个特定年份的数据SAS创建按年份排序的子表,sas,Sas,我在SAS中有一个表,其中包含来自证券交易所的数据。其中一列包含有关日期的信息。我想创建子表,每个子表只保存一个特定年份的数据 data year1 year2 year3 yearN; set stockdata; if year(date) = 2014 then output year1; else if year(date) = 2013 then output year2; else if year(date) = 201
data year1 year2 year3 yearN;
set stockdata;
if year(date) = 2014 then
output year1;
else if year(date) = 2013 then
output year2;
else if year(date) = 2012 then
output year3;
else
output yearN;
run;
我想您也可以使用case语句。假设您想这样做(通常情况下,这是一个较差的选项,因为可以使用
按年从一个数据集运行按年单独运行的分析;
,但这有时当然是合适的),执行此操作的金标准方法是哈希表,因为哈希表可以根据数据生成无限表。如果我今天下午有时间运行的话,我会用哈希表编辑一个这样做的方法;这是上描述的“散列”方法
哈希代码,改编自上面的sascommunity.org页面:
data have;
call streaminit(7);
do year=1998 to 2014;
do id= 1 to 10;
x=rand('Uniform');
output;
end;
end;
run;
data _null_ ;
dcl hash byyear () ;
byyear.definekey ('k') ; if `id` or similar is a safe unique ID you could use that here, otherwise `k` is your unique identifier - hash requires unique;
byyear.definedata ('year','id','x') ;
byyear.definedone () ;
do k = 1 by 1 until ( last.year ) ;
set have;
by year ;
byyear.add () ;
end ;
dsetname=cats('year',year);
byyear.output (dataset: dsetname) ;
run ;
有一组类似的方法围绕使用宏生成代码展开。详细介绍了一种实现这一点的方法;我不会详细解释它,因为我认为它不如哈希方法(即使它是较低的CPU时间,它比纯宏方法或纯哈希方法更复杂),但在某些情况下它可以更好。
宏方法的一个简单示例使用概念性的定义了A框架:
proc sql;
select distinct(cats('year',year(date))) into :dsetlist
separated by ' '
from have;
select distinct(cats('%outputyear(year=',year(date),')')) into :outputlist
separated by ' '
from have;
quit;
%macro outpuyear(year=);
if year(date)=&year. then output year&dset.;
%mend outputyear;
data &dsetlist.;
set have;
&outputlist.;
run;