這可能會更容易使用數據步驟而不是宏循環(因爲大多數情況是!)。
在這種情況下,你有兩個問題:
- 如何批量重命名變量
- 如何
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循環內的部分,在您的數據集拉出name
的x
工作)在前面names
數據的步驟,但是你想創建NEW_NAME。如果您在此處具有靈活性(因爲它是標準和最簡單的解決方案),您可以使用新名稱的YYQ格式。否則,您可能想要使用put
然後子字符串或quarter()
和year()
功能脫離此處的日期變量。
來源
2014-07-07 16:07:48
Joe
對不起,代碼包含循環,其中我= 0到40乘1 – user3812923