我正在尝试重命名变量x0 - x40,以便x0将变为y_q1_2014,x1将变为y_q4_2013,x2将变为y_q3_2013,依此类推至x40将变为y_q1_2004。
我希望我的新变量在其名称中显示观察的四分之一和一年。现在我在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 :(得分:3)
使用数据步骤而不是宏循环可能更容易(大多数情况都是如此!)。
在这种情况下,您有两个问题:
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总是指数据中最近的一个季度,还是它总是意味着q1 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;
因此,您可以在之前的x
数据步骤中使用此代码(do循环中的部分,对您从数据集中的name
中提取的names
进行操作)根据需要创建new_name。如果您有灵活性,可以在新名称中使用YYQ格式(因为它是标准的,也是最简单的解决方案)。否则,您可能希望在此处使用put
然后使用子字符串或quarter()
和year()
函数来解除此问题。