4

SAS 中是否有一种简单的方法可以将字符串转换为可用作列名的 SAS 安全名称?

IE。

Rob Penridge ---->  Rob_Penridge

$*@'Blah@*   ---->  ____Blah__

我正在使用 aproc transpose然后想在转置后使用重命名的列。

编辑: 8 年的后续行动......现在有更好的方法来做到这一点吗?我觉得我在某个时候看到了一种更好的方法,但现在我正在努力寻找任何需要做的文档/示例。

4

5 回答 5

5

proc transpose只要您设置,将采用这些名称而不进行任何修改options validvarname=any;

如果您想在之后使用这些列,您可以使用 NLITERAL 函数来构造可用于引用它们的命名文字:

options validvarname=any;

/* Create dataset and transpose it */
data zz;
    var1 = "Rob Penridge";    
    var2 = 5;
    output;

    var1 = "$*@'Blah@*";
    var2 = 100;
    output;           
run;

proc transpose
    data = zz
    out  = zz_t;
    id     var1;
run;


/* Refer to the transposed columns in the dataset using NLITERAL */
data _null_;
    set zz;
    call symput(cats("name", _n_), nliteral(var1));
run;

data blah;
    set zz_t;
    &name1. = &name1. + 5;
    &name2. = &name2. + 200;
run;
于 2012-01-31T16:39:11.363 回答
2

查看VALIDVARNAME系统选项。它可能允许您接受无效的 SAS 名称。

NOTNAME函数也有助于帮助查找无效字符。

于 2012-01-28T14:14:09.363 回答
2

可以试试perl正则表达式函数。由于对于列名,第一个字符不应该是数字,那么它就更复杂了。

data _null_;
name1 = "1$*@' Blah1@*";
name2 = prxchange("s/[^A-Za-z_]/_/",1,prxchange("s/[^A-Za-z_0-9]/_/",-1,name1));
put name2;
run; 
于 2012-01-28T00:36:13.903 回答
1

如何使用 SAS 的regular expression功能?例如:

data names;
 set name;
 name_cleaned = prxchange('s/[^a-z0-9 ]/_/i', -1, name);
run;

这会将任何不是字母、数字或空格的内容转换为_. 您可以在 . 后面添加您希望允许的其他字符到列表中9。请注意,某些字符是“特殊的”,必须以\.

于 2012-01-28T00:47:49.560 回答
0

您还可以使用IDLABEL转置中的语句添加与原始值匹配的标签。然后使用该VARLABEL函数检索标签并以这种方式使用它们。

于 2012-01-30T16:13:29.947 回答