用do循环重命名变量,然后调整条件

时间:2014-07-07 15:38:09

标签: sas sas-macro

我正在尝试重命名变量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; 

1 个答案:

答案 0 :(得分:3)

使用数据步骤而不是宏循环可能更容易(大多数情况都是如此!)。

在这种情况下,您有两个问题:

  1. 如何批量重命名变量
  2. 如何将x#转换为y_q#_####

  3. 重命名变量的一种简单方法是创建一个变量名称为行的数据集,然后创建新的变量名称。然后,您可以非常轻松地将其拉入重命名列表。

    所以这样的事情会这样做。

    *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()函数来解除此问题。