我正在使用调查数据,其中我们数据库中的变量名称是描述性的,而不是按顺序编号。它们在数据库中是顺序的(从左到右移动)。我想在带有编号变量的程序中工作,并且我没有成功地尝试以编程方式重命名它们而不必手写每个更改(总共有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等......
非常感谢任何帮助。
答案 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;