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