簡體   English   中英

SAS創建按年份排序的子表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM