使用SAS中的数组重命名变量列表

时间:2019-04-27 02:15:31

标签: sas

我试图通过使用数组添加后缀来重命名变量列表。我的代码如下。我首先将旧变量列表和新变量列表生成为两个数组。然后,我遍历列表以重命名每个变量。我收到以下错误消息。怎么了?谢谢!

%let vars = tone1 tone2 tone3 fog reading kincaid flratio spec numint 
            uncert;
%let suffix = mda;

%put &vars;
%put &suffix;


 /*Generate the variable lists*//

proc transpose data=test(obs=0) out=names;
  var &vars;
run;



 proc sql noprint ;
   select _name_, cats(_name_,'_'&suffix)
   into :old_list separated by ' ', new_list separated by ' '
   from names; 
 quit;

%put &old_list;
%put &new_list;


data test;
  set test;
  array old[*] &old_list;
  array new[*] &new_list;
  do i=1 to dim(&old_list);
    rename old[i] = new[i];
   end;
 run;

我收到以下错误消息:

1597  data test;
1598    set test;
1599    array old[*] &old_list;
1600    array new[*] &new_list;
1601    do i=1 to dim(&old_list);

NOTE: Line generated by the macro variable "OLD_LIST".
1     Tone1 Tone2 Tone3 Fog Reading Kincaid FLRatio SPEC NumInt Uncert
        -----
        388
        76
1602      rename old[i] = new[i];
                -
                22
                76
ERROR 388-185: Expecting an arithmetic operator.

ERROR 76-322: Syntax error, statement will be ignored.

ERROR 22-322: Syntax error, expecting one of the following: -, :, =.

1603    end;
1604    run;

2 个答案:

答案 0 :(得分:3)

DIM()函数需要一个数组名,而不是一个变量名列表。 RENAME语句需要变量名,而不是数组引用。

只需将OLD = NEW对直接生成到一个宏变量中,以便您可以在RENAME语句中使用它。

proc sql noprint ;
  select catx('=',_name_, cats(_name_,"_&suffix"))
    into :rename_list separated by ' '
    from names
  ; 
quit;

proc datasets nolist lib=work;
  modify test;
  rename &rename_list;
  run;
quit;

答案 1 :(得分:2)

rename不是动态可执行语句。换句话说,在运行时的数据步骤不能添加或更改在自动编译时构建的程序数据向量(pdv)。

您选择让TRANSPOSE承担的角色是,每个var仅获得一行数据(确实很有趣)。

仅更改变量名的最终目标是使元数据比较适合Proc DATASETS。重写整个数据集,仅更改列名就可以使用小数据,但是对于大数据集则不是一个好主意。

所以真正的任务是将以空格分隔的令牌列表更改为可以在重命名语句中使用的项<token>=<newtoken>的新列表。

%let renamelist = %sysfunc(prxchange(s/(\w+)\b/$1=$1&SUFFIX/,-1,&VARS));

proc datasets nolist lib=work;
  modify test;
  rename &renamelist;
run; quit;