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

Noo*_*der 3 rename sas

让我们假设我们有以下数据集:

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"始终引用数据集中的第二列,无论其名称如何.是否有直接或间接的方式来实现这一目标?

Lon*_*ish 9

我认为最简单的方法是从元数据表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)


SRS*_*ift 6

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


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

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

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(结合字典表方法)进行重命名,因为这可以更改变量名称而无需读写每一行数据.