将非顺序变量名称重命名为sas中的顺序名称

时间:2013-02-14 14:30:51

标签: sas

我正在使用调查数据,其中我们数据库中的变量名称是描述性的,而不是按顺序编号。它们在数据库中是顺序的(从左到右移动)。我想在带有编号变量的程序中工作,并且我没有成功地尝试以编程方式重命名它们而不必手写每个更改(总共有87个变量)。

我曾尝试使用array,但由于它们没有顺序命名,也没有用,也没有共同的结构(没有公共前缀或后缀)。

示例数据如下:


data svy;
  input id relationship outburst checkwork goodideas ;
cards;
101 3 4 5 6
102 4 5 6 6
103 1 1 8 1
104 2 3 2 4
;
run;

*****  does not work  ;
data svy_1; set svy;
rename relationship--goodideas = var01--var04;
run;
quit;

以上代码在日志中返回以下错误:

ERROR: Missing numeric suffix on a numbered variable list (relationship-goodideas).

我想将变量重命名为:var01,var02等......

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

一些事情:

您的数据步骤#2不对 - 它没有set语句。此外,它不需要“退出” - 退出仅适用于通常为“编程环境”的某些PRO,例如PROC SQL,PROC FORMAT,PROC DATASETS。它没有任何伤害,但它看起来很奇怪:)

数据集中的顺序变量列表是双破折号。所以,您可以通过以下方式轻松创建一个数组:

array myvars relationship--goodideas;

所以,如果这对你来说足够好(没有重命名),那就去吧。如果你真的想重命名它们(IMO有点不好意思,因为它消除了变量名称的一些含义,使代码更难阅读,虽然我理解你为什么要这样做的原因),你不能使用不幸的是 - 虽然它是正确的,但RENAME语句不支持它。

82   *****  does not work  ;
83   data svy_1;
84   rename relationship--goodideas = var01-var04;
            ------------
            47
ERROR 47-185: Given form of variable list is not supported by RENAME. Statement is ignored.

85   run;

不幸的是,您不能使用数组来执行重命名语句;所以你必须做别的事。这是一个答案。

proc contents data=svy out=svy_vars(keep=name varnum) noprint;
run;

proc sort data=svy_vars; 
by varnum;
run;

data for_rename;
set svy_vars;
if name in ('relationship' 'outburst' 'checkwork' 'goodideas') then do;
  namectr+1;
  new_name=cats(name,'=','var',put(namectr,z2.));
  output;
end;
run;

proc sql;
select new_name into :renlist separated by ' ' from for_rename;
quit;

proc datasets nolist;
modify svy;
rename &renlist;
quit;

您可以使用PROC SQL和DICTIONARY.COLUMNS表或数据步骤和SASHELP.VCOLUMN以更短的方式执行类似的操作,但proc内容方法对于正在发生的事情更加透明。如果您有四个以上的变量,您可能希望将该IN语句更改为否定语句(如果名称不在(不更改的事物列表中))如果这更容易,或者甚至使用VARNUM变量本身来确定哪些变量想要改变(如果(2:5)中的varnum可以在那里工作)。

答案 1 :(得分:1)

一位同事想出了最好的方法:


*****  does work ;

data svy_1;
set svy;
array old { 4 } relationship--goodideas;
array var { 4 } ;

do i = 1 to 4;
var[i] = old[i];
end;
drop i;
run;