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

在sas中将非顺序变量名称重命名为顺序名称,sas,Sas,我正在处理调查数据,其中数据库中的变量名是描述性的,而不是顺序编号的。它们在数据库中是连续的(从左向右移动)。我希望在我的程序中使用编号的变量,但我尝试以编程方式重命名它们而不必手动写出每一个更改(总共有87个变量),但没有成功 我曾尝试使用数组,但没有成功,因为它们没有按顺序命名,也没有公共结构(没有公共前缀或后缀) 示例数据如下: 上述代码在日志中返回以下错误: ERROR: Missing numeric suffix on a numbered variable list (rela

我正在处理调查数据,其中数据库中的变量名是描述性的,而不是顺序编号的。它们在数据库中是连续的(从左向右移动)。我希望在我的程序中使用编号的变量,但我尝试以编程方式重命名它们而不必手动写出每一个更改(总共有87个变量),但没有成功

我曾尝试使用
数组
,但没有成功,因为它们没有按顺序命名,也没有公共结构(没有公共前缀或后缀)

示例数据如下:



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

ERROR: Missing numeric suffix on a numbered variable list (relationship-goodideas).
我想将变量重命名为:var01、var02等

非常感谢您的帮助。

有几件事:

您的数据步骤#2不正确-它没有set语句。此外,它不需要“退出”——退出仅适用于通常为“编程环境”的某些进程,如PROC SQL、PROC格式、PROC数据集。这没什么害处,但看起来很奇怪:)

数据集变量列表中的顺序为双破折号。因此,您可以使用以下内容轻松创建一个数组:

array myvars relationship--goodideas;
所以,如果这对你来说足够好(没有重命名),那么,就去做吧。如果您真的想重命名它们(在我看来这是一个坏主意,因为它剥夺了变量名的某些含义,使代码更难阅读,尽管我理解您为什么要这样做的原因),不幸的是,您不能使用它-虽然它是正确的,但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 contents方法对所发生的事情更加透明。如果您有四个以上的变量,您可能希望将IN语句更改为否定语句(如果name not IN(不更改的事项列表)),如果这更容易,甚至可以使用VARNUM变量本身来确定要更改哪些变量(如果VARNUM IN(2:5)将在那里工作).

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



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;
*****  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;