0

我正在使用调查数据,其中我们数据库中的变量名称是描述性的,而不是按顺序编号的。它们在数据库中是连续的(从左到右移动)。我想在我的程序中使用带编号的变量,但我试图以编程方式重命名它们而不必手动写出每个更改(总共有 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 等...

任何帮助是极大的赞赏。

4

2 回答 2

1

一些东西:

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

Sequential-in-the-dataset 变量列表是双破折号。所以,你可以用这些简单地创建一个数组:

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 contents 方法对于正在发生的事情更加透明。如果您有四个以上的变量,您可能希望将该 IN 语句更改为否定语句(如果名称不在(不更改的事物列表)),如果这样更容易,或者甚至使用 VARNUM 变量本身来确定您使用哪些变量想要改变(如果 (2:5) 中的 varnum 可以在那里工作)。

于 2013-02-14T15:39:45.813 回答
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;

于 2013-02-14T21:16:58.490 回答