我在SAS有一张表,其中包含来自证券交易所的数据。其中一列包含有关日期的信息。我想创建子表,每个子表只保存一个特定年份的数据。
答案 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;
我猜你也可以使用案例陈述。