![](/img/trans.png)
[英]Creating SAS macro to find the start month and year for a specified window
[英]SAS creating subtables ordered by year
我在SAS中有一張表格,其中包含來自證券交易所的數據。 其列之一包含有關日期的信息。 我想創建一個子表,每個子表僅保存某一特定年份的數據。
假設您要執行此操作(通常這是次優選擇,因為可以按年使用一個數據集運行按年分別運行的分析by year;
但當然,有時這可能是適當的),執行此操作的黃金標准方法是哈希表,因為哈希表可以基於數據生成無限的表。 如果今天下午我有時間在做事情,我將編輯一種使用哈希表執行此操作的方法。 這是本頁上介紹的“哈希”方法。
哈希代碼,改編自上面的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 ;
有一組類似的方法,圍繞使用宏來生成代碼。 本文詳細介紹了一種實現方法。 我不會詳細解釋它,因為我認為它不如hash方法(即使它的CPU時間短,它的編寫也比純宏方法或純hash方法更復雜),但在某些情況下,它可以會更好。
使用概念的宏方法的一個簡單示例have
定義:
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;
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;
我猜你也可以使用案例陳述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.