【问题标题】:Rename Variable Regardless of its Name in SAS重命名变量,无论其在 SAS 中的名称如何
【发布时间】:2015-05-14 10:34:34
【问题描述】:

假设我们有以下数据集:

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

【问题讨论】:

    标签: sas rename


    【解决方案1】:

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

    【讨论】:

    • 我喜欢使用byte(),以前从未遇到过。谢谢。
    【解决方案2】:

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


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

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

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

    【讨论】:

    • 您的第二个答案与我的非常相似(并且绝对是要走的路)。我也想到了一个数组,但是因为你提到的原因打折了
    • 确实非常相似。我一直很遗憾不能在drop/keep/rename 语句中使用数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多