4

SASで、文字列を列名として使用されるSASセーフ名に変換する簡単な方法はありますか?

すなわち。

Rob Penridge ---->  Rob_Penridge

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

を使用していてproc 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

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 に答える
2

VALIDVARNAMEシステムオプションをご覧ください。無効なSAS名を受け入れることができる場合があります。

また、NOTNAME関数は、無効な文字を見つけるのに役立ちます。

于 2012-01-28T14:14:09.363 に答える
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 に答える