在SAS中重命名变量,无论其名称如何

时间:2015-03-12 10:12:18

标签: sas rename

假设我们有以下数据集:

ID    Stress_Level    Heart_Rate
1          5              10
2          7              12
3          9              16

用于重命名变量的代码将是:

data test1;
    set test0;
    rename Stress_Level=A Heart_Rate=B;
run;

但是,我想要做的是重命名2列而不使用它们的名称。是否有"内部" SAS命令根据变量来处理变量?因此,例如,第二列的Stress_Level可以作为" COL2"或类似的东西。因此代码将是:

data test1;
    set test0;
    rename COL2=A COL3=B;
run;

其中" COL2"无论名称如何,它总是引用数据集中的第二列。是否有直接或间接的方式来实现这一目标?

2 个答案:

答案 0 :(得分:9)

我认为最简单的方法是从元数据表DICTIONARY.COLUMNS构建一个重命名语句字符串(这个视图是SASHELP.VCOLUMN)。它保存活动库中所有表的列名和位置 我已经利用ASCII序列(byte函数)来重命名列A,B等,显然,如果要重命名的列数超过26列,则会遇到问题。表! 如果您想从不同于2的列开始,您还需要调整varnum+63计算。

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

答案 1 :(得分:6)

有几种方法可以做到这一点。


最短的方法可能是使用数组。唯一的缺点是你需要事先知道变量的类型和第一个变量的名称。

如果它们都是数字,如示例所示,可以使用以下内容:

data test1;
    set test0;
    array vars[*] _numeric_;
    A = vars[2];
    B = vars[3];
    keep ID A B;
run;

数组中只能有一种类型的变量,如果它们不是全数字或全部字符,它会稍微复杂一些。此外,如果您不想拥有第二个和第三个变量的副本,您将需要知道第一个变量的名称以及您希望保留的任何其他变量。


更强大的方法是使用dictionary table和宏变量中的信息来编写重命名语句:

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;

SAS将有关数据集的信息存储在字典表中,这些表具有sashelp库中可用的视图。查看一些sashelp.v*表以查看可用的信息类型。 proc sql colon用于在宏变量中存储值,然后可以在rename语句中使用。


我推荐第二种方法,因为它更灵活,更少依赖于数据的确切结构。当您有多个要重命名的变量时,它也会扩展得更好。

最后,如果您想对数据集进行更改,您可能需要查看使用proc datasets(结合字典表方法)进行重命名,因为这可能会更改变量名称,无需读写每一行数据。