SAS创建按年份排序的子表

时间:2014-06-25 10:59:34

标签: sas

我在SAS有一张表,其中包含来自证券交易所的数据。其中一列包含有关日期的信息。我想创建子表,每个子表只保存一个特定年份的数据。

2 个答案:

答案 0 :(得分:2)

假设你想这样做(通常,这是一个较差的选择,因为按年份分别运行的分析可以使用by year;从一个数据集运行,但当然这有时是合适的),黄金标准方法这样做是哈希表,因为哈希表可以根据数据生成无限制的表。如果我今天下午在运行时有时间,我将使用哈希表编辑一个方法。它是this page上描述的'哈希'方法。

哈希代码,改编自上面的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 ;

有一组类似的方法围绕使用宏来生成代码。 This paper详细介绍了一种方法;我不会详细解释它,因为我认为它不如哈希方法(即使它是较低的CPU时间,写入比纯宏方法或纯哈希方法更复杂)但在某些情况下它可以更好。

使用定义的概念性have aframe的宏方法的简单示例:

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;

答案 1 :(得分:0)

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;

我猜你也可以使用案例陈述。