2014-07-07 86 views
1

我想重命名變量x0 - x40,以便x0將成爲y_q1_2014,x1將成爲y_q4_2013,x2將成爲y_q3_2013等等,直到x40將成爲y_q1_2004。Sas重命名變量與做循環,如果然後條件

我希望我的新變量在名稱中顯示觀察的季度和年份。現在我在SAS中有下面的宏,它工作不正常:j和k的值不會根據if - then條件而改變。我究竟做錯了什麼?

%macro rename(data); 

%let j=1; 
%let k=2014; 

%do i = 0 %to 40 %by 1; 

    data mydata; 
    set &data.; 

    y_q&j._&k. = x&i.; 

    if &j.=1 then do k = &k.-1 and j = 4; 

    else do j=&j.-1; 

    run; 

%end; 

%mend; 
+0

對不起,代碼包含循環,其中我= 0到40乘1 – user3812923

回答

3

這可能會更容易使用數據步驟而不是宏循環(因爲大多數情況是!)。

在這種情況下,你有兩個問題:

  1. 如何批量重命名變量
  2. 如何x#y_q#_####

一個簡單的方法來重命名變量是轉換創建一個包含變量名稱作爲行的數據集,然後創建新的變量名稱。然後,您可以非常輕鬆地將其拖入重命名列表中。

所以像這樣的事情會做到這一點。

*Create dataset with names in it. 
data names; 
set sashelp.vcolumn; 
where memname='HAVE' and libname='WORK' and name =: 'X'; 
keep name; 
run; 

*some operation to determine new_name needs to go in that dataset also - coming later; 


*Now create a list of rename macro calls. 
proc sql; 
select cats('%rename(var=',name,',newvar=',new_name,')') 
into :renamelist separated by ' ' 
from names; 
quit; 

*Here is the simple rename macro. 
%macro rename(var=,newvar=); 
rename &var.=&newvar.; 
%mend rename; 

*Now do the renames. Can also go in a data step. 
proc datasets lib=work; 
modify have; 
&renamelist. 
quit; 

如何轉換是一個更有趣的問題,並引出了一個問題:這是一個時間的事情,或者這是一個反覆的過程?如果這是一個重複的過程,X0是否意味着數據中最近的一個季度,還是總是意味着2014年第一季度?

假設它總是最新的季度,您可以使用intnx來做到這一點。

%let initdate='01JAN2014'd; 

data have; 
do x = 0 to 40; 
    qtr = intnx('QUARTER',&initdate,-1*x); 
    format qtr YYQ.; 
    output; 
end; 
run; 

可以因此使用此代碼(do循環內的部分,在您的數據集拉出namex工作)在前面names數據的步驟,但是你想創建NEW_NAME。如果您在此處具有靈活性(因爲它是標準和最簡單的解決方案),您可以使用新名稱的YYQ格式。否則,您可能想要使用put然後子字符串或quarter()year()功能脫離此處的日期變量。