2013-04-04 52 views
1

以下是一些C代碼。我如何在sas中做同樣的事情?用兩個計數器循環

For(i=30, j=1; i<=41, j<=12; i++, j++) 
    (
    closure(i,j) /*calling function with input parameters I and j */ 
    ); 

我基本上要使用循環有兩個櫃檯做以下宏調用I和J

%closure(30,201201); 
%closure(31,201202); 
%closure(32,201203); 
%closure(33,201204); 
%closure(34,201205); 
%closure(35,201206); 
%closure(36,201207); 
%closure(37,201208); 
%closure(38,201209); 
%closure(39,201210); 
%closure(40,201211); 
%closure(41,201212); 

請注意,我不想使用嵌套循環。 小貼士讚賞。

+0

模糊的主題行不太可能對未來的訪問者有同樣的問題。你甚至沒有標記這個問題[sas]! – 2013-04-04 13:30:05

+0

請參閱[在sas中循環](http://blogs.sas.com/content/iml/2011/09/07/loops-in-sas/),然後在DO循環的變體:DO WHILE和DO UNTIL' – 2013-04-04 13:35:40

回答

1

所以,如果你想

  • %關閉(30,201201);
  • %結案(31,201202);
  • %(32,201203);
  • %結案(33,201204);
  • %結案(34,201205);
  • %結案(35,201206);
  • %結案(36,201207);
  • %(37,201208);
  • %結案(38,201209);
  • %結案(39,201210);
  • %結案(40,201211);
  • %結案(41,201212);

那麼它會更好,要麼你計算J的價值,並把它帶到201200左右。 還是應該用201201啓動j循環,並最終以201212 乾脆提出

對於(I = 30,J = 201201;我< = 41,J < = 201212;我++,J ++)

closure(i,j) 

);

2

在SAS中執行此操作取決於數據的結構。這是可能的:

%do i = 1 to 12; 
    %closure(%eval(29+i),%eval(201200+i)); 
%end; 

這有點奇怪,但它應該工作正常。

你也可以在%閉包宏中做到這一點。通過我,然後確定宏中其他參數的值,如果它們總是有這種關係的話。如果他們總是有一些關係,但2012年和18是可變的,那麼你有幾種選擇:

定義2012年和29宏變量前面這一步的,並且在這樣的代碼替換它們。

%let year=2012; 
%let startrec=29; 
%do i = 1 to 12; 
    %closure(%eval(&startrec.+&i.),%eval(&year.00+&i.)); 
%end; 

使用日期函數來確定j的值,如果它並不總是01-12。

%closure(30,%sysfunc(intnx(month,'01JUN2011'd,&i.-1))) 

(您可能希望將結果YYYYMM格式格式,也可能只是爲富裕使用日期的結果,這取決於%關閉)

定義所有這些術語在數據集,並從數據集中調用宏。

data to_call; 
input i j; 
datalines; 
30 201201 
31 201202 
.... ; 
run; 

proc sql; 
select cats('%closure(',i,',',j,')') into :calllist separated by ' ' from to_call; 
quit; 

&calllist. 

這是一個更加「SAS'sy的方式做事情,做驅動的過程數據。當i和j參數作爲數據元素存儲在某處(例如在控制表中,或者從其他數據源派生)時,最常用。