簡體   English   中英

循環以創建由SAS中的列表組成的多個宏變量

[英]Loop to create multiple macro variables consisting of lists in SAS

我是SAS宏寫作的新手,我一直在努力為以下實例編寫代碼。

我有一個列表,它是comp_id和date的組合,如下所示 -

DATA compno_date_list; 
  INPUT compno sdate; 
  DATALINES; 
12490 20090120 
87432 20090120
24643 20090120
87432 20090119
12490 20090105
24643 20090105
;

現在,這是一個示例列表。 我需要在一個非常大的數據集上運行這個列表上的一個巨大的宏。 由於每行都要這樣做,即comp_ID - 日期組合將花費大量時間,我計划選擇唯一日期並創建一個包含所有日期的宏變量。 對於此宏變量中的每個日期,我需要創建一個宏變量,其中包含與該日期相關的comp_ID列表。 所以,我計划運行以下生成'n'宏變量的宏,其中'n'是日期總數,如下所示 -

%MACRO GET_MACRO_VARS();
%let j = 1;
%let sdate3 = %scan(&sdate1., &j.);
%do %while(&j.<= &ndate.);

proc sql;
  select distinct compno into : n&j.
  separated by ' '
 from compno_date_list where sdate=&sdate3.;
%let j= &j. + 1;
%let sdate3 = %scan(&sdate1., &j.);
%put &j.; 
%put &sdate3.;
%put &(n&j);

%end;
%mend;

%GET_MACRO_VARS();

這里,sdate1是包含所有唯一日期的宏變量,ndate是一個宏變量,包含總唯一日期的計數。

但是,如果我運行此代碼,我在上面宏中的最后3%put語句的日志文件中獲得以下值 -

1 + 1
20090105
&(n1+ 1)

即j被視為字符變量(?)。 這是怎么回事?我該如何糾正這個? 謝謝!

SAS以遞歸方式解析以“%”或“&”開頭的所有內容。 對於%let語句,它將等號右側的所有內容作為字符串存儲到宏變量中(宏變量始終是字符串)。

對於“%let j =&j。+ 1;” 它執行以下操作:

  1. 解析“&j”,以便留下“%let j = 1 + 1;”;
  2. 由於SAS沒有看到以等號右邊的%或a開頭的任何內容,因此將j設置為“1 + 1”。

為了增加j,您需要將行更改為“%let j =%eval(&j + 1);”。 所以步驟如下:

  1. 解析最里面的“%”或“&”,即“&j”,因此該行變為“%let j =%eval(1 + 1);”。
  2. 解析“%eval(1 + 1)”,使該行變為“%let j = 2;”。
  3. 將j設置為“2”。

獲取名稱由另一個變量定義的變量值的語法是&& n&j,因此&(n&j)不起作用。

話雖如此,您正在嘗試做的更簡單的方法如下:

%do j=1 %to %sysfunc(countw(&sdate1));
  proc sql;
    select distinct compno into : n&j separated by ' '
    from compno_date_list where sdate=%scan(&sdate1, &j);
  quit;
  %put &&n&j;
%end;

需要注意的一件事是,如果您正在處理大型數據集,您可能希望嘗試通過在數據步驟中使用多個輸出數據集或盡可能使用哈希對象來避免為每個日期檢查它,因為這似乎是一個非常時間消耗任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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