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

我在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) = 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;