2013-10-12 47 views
1

我試圖使用宏和數組來延遲一組變量(id)。我的步驟是:1。 滯後的所有變量(組沒關係) 2. .使用宏和數組來延遲SAS中的一組變量

更換不當滯後細胞,但我發現我的代碼是越野車和欣賞任何建議。

下面是數據:

data old; 
    input id sale capx profit; 
datalines; 
1 11 111 1111 
1 12 112 1112 
1 13 113 1113 
1 14 114 1114 
1 15 115 1115 
1 16 116 1116 
1 17 117 1117 
2 21 221 2221 
2 22 222 2222 
2 23 223 2223 
3 31 331 3331 
3 32 332 3332 
3 33 333 3333 
3 34 334 3334 
4 41 441 4441 
4 42 442 4442 
4 43 443 4443 
4 44 444 4444 
4 45 445 4445 
4 46 446 4446 
; 
run; 

代碼:

data new; 
set old; 
run; 

%macro lag_var(dataset, lag); 
    proc sort data=&dataset;by id; 
    data &dataset; 
    set &dataset; 
    by id; 
    array vs(3) sale capx profit; 
    %do j=1 %to 3; 
      %do i=1 %to &lag; 
      lag&j&i=lag&i(vs(&j)); 

      if first.id then 
      do; 
      count=1; 
      lag&j&i=.; 
      end; 
      count+1; 
      if (not first.id and count<=&i) then 
      do; 
      lag&j&i=.; 
      count+1; 
      end; 
      %end; 
    %end; 
    run; 
%mend lag_var; 

%lag_var(new,5) 

電流輸出(錯誤): enter image description here

我的預計業績: enter image description here

DomPazz」 s輸出: enter image description here

+0

你能談談你想達到什麼樣的?它看起來像是你可以/應該用不同的方法做的事情。很明顯,你想總結每組的最後一個記錄的信息 - 爲了什麼目的?它的一些看起來是你的示例數據的確定性。而且你的方法看起來並不像它會在更多的觀察結果中存在。 – sasfrog

+0

您是否有權訪問PROC EXPAND?這對於這些類型的場景來說非常有用。 – 2013-10-12 22:55:12

回答

2

那些後來的團隊保持其價值的原因是,你超過了遞增count

我覺得這樣是你在找什麼:

%macro lag_var(dataset, lag); 
    proc sort data=&dataset;by id; 
    data &dataset; 
    set &dataset; 
    by id; 
    array vs(3) sale capx profit; 
    %do j=1 %to 3; 
      %do i=1 %to &lag; 
      lag&j&i=lag&i(vs(&j)); 
      %end; 
    %end; 

    if first.id then do; 
     count=0; 
     %do j=1 %to 3; 
      %do i=1 %to &lag; 
      lag&j&i=.; 
      %end; 
     %end; 
    end; 

    count+1; 

    %do j=1 %to 3; 
     %do i=1 %to &lag; 

      if (not first.id and count<=&i) then do; 
       lag&j&i=.; 
      /*count+1;*/ 
      end; 
     %end; 
    %end; 
    run; 
%mend lag_var; 

編輯:改變計數1初始化爲0

+0

非常感謝您的幫助!但是我認爲你的解決方案與我的預期結果相差不大(請參閱原文)。例如,突出顯示的數字不應該存在。我很抱歉,這是我的第一個SAS宏代碼... –

+0

問題在於count的初始值。將其更改爲0而不是1.它應該刪除通過值邊界出現的那些額外值。 – DomPazz