让我们假设我们有以下数据集:
ID Stress_Level Heart_Rate
1 5 10
2 7 12
3 9 16
Run Code Online (Sandbox Code Playgroud)
用于重命名变量的代码将是:
data test1;
set test0;
rename Stress_Level=A Heart_Rate=B;
run;
Run Code Online (Sandbox Code Playgroud)
但是,我想要做的是重命名2列而不使用它们的名称.是否有一个"内部"SAS命令根据变量来处理变量?因此,例如,作为第二列的Stress_Level可以被称为"COL2"或类似的东西.因此代码将是:
data test1;
set test0;
rename COL2=A COL3=B;
run;
Run Code Online (Sandbox Code Playgroud)
其中"COL2"始终引用数据集中的第二列,无论其名称如何.是否有直接或间接的方式来实现这一目标?
我认为最简单的方法是从元数据表DICTIONARY.COLUMNS构建一个重命名语句字符串(这个视图是SASHELP.VCOLUMN).它保存活动库中所有表的列名和位置.
我利用ASCII序列(byte函数)来重命名列A,B等,显然如果在表中重命名的列超过26列,你会遇到问题!varnum+63如果您想从不同于2的列开始,您还需要调整计算.
proc sql noprint;
select cats(name,"=",byte(varnum+63)) into :newvars separated by ' '
from dictionary.columns
where libname = 'WORK' and memname='HAVE' and varnum>=2;
quit;
data want;
set have;
rename &newvars.;
run;
/* or */
/*
proc datasets lib=work nolist nodetails;
modify have;
rename &newvars.;
quit;
*/
Run Code Online (Sandbox Code Playgroud)
有几种方法可以做到这一点.
最短的方法可能是使用数组.唯一的缺点是你需要事先知道变量的类型和第一个变量的名称.
如果它们都是数字,如示例中所示,则可以使用以下内容:
data test1;
set test0;
array vars[*] _numeric_;
A = vars[2];
B = vars[3];
keep ID A B;
run;
Run Code Online (Sandbox Code Playgroud)
在数组中只能有一种类型的变量,因此如果它们不是全数字或全部字符,则会稍微复杂一些.此外,如果您不想拥有第二个和第三个变量的副本,则需要知道第一个变量的名称以及您希望保留的任何其他变量.
更健壮的方法是使用字典表和宏变量中的信息来编写重命名语句:
proc sql;
/* Write the individual rename assignments */
select strip(name) || " = " || substr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", varnum - 1, 1)
/* Store them in a macro variable and separate them by spaces */
into :vars separated by " "
/* Use a sas dictionary table to find metadata about the dataset */
from sashelp.vcolumn
where
libname = "WORK" and
memname = "TEST0" and
2 <= varnum <= 3;
quit;
data test1;
set test0;
rename &vars.;
run;
Run Code Online (Sandbox Code Playgroud)
SAS将有关数据集的信息存储在字典表中,这些表具有sashelp库中可用的视图.查看一些sashelp.v*表格,了解可用的信息类型.的proc sql结肠被用来存储在宏变量,然后可以在被使用的值rename声明.
我建议使用第二种方法,因为它更灵活,更少依赖于数据的确切结构.当您有多个要重命名的变量时,它也会扩展得更好.
最后,如果您想对数据集进行更改,您可能需要查看使用proc datasets(结合字典表方法)进行重命名,因为这可以更改变量名称而无需读写每一行数据.