カラム名として使用されるSASセーフな名前に文字列を変換する簡単な方法はありますか?SASセーフカラム名
ie。
Rob Penridge ----> Rob_Penridge
$*@'[email protected]* ----> ____Blah__
私はproc transpose
を使用して、転置後の列の名前が変更された仕事をしたいんです。
カラム名として使用されるSASセーフな名前に文字列を変換する簡単な方法はありますか?SASセーフカラム名
ie。
Rob Penridge ----> Rob_Penridge
$*@'[email protected]* ----> ____Blah__
私はproc transpose
を使用して、転置後の列の名前が変更された仕事をしたいんです。
proc transpose
はあなたを参照するために使用することができますという名前のリテラルを構築するためにNLITERAL機能を使用することができ、限り、あなたは後で列を操作する場合は、options validvarname=any;
を設定すると、そのままその名前がかかりますそれらは:
options validvarname=any;
/* Create dataset and transpose it */
data zz;
var1 = "Rob Penridge";
var2 = 5;
output;
var1 = "$*@'[email protected]*";
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;
perl正規表現機能を試してみてください。 カラム名のために、最初の文字は数値であってはならないので、もっと複雑です。
data _null_;
name1 = "1$*@' [email protected]*";
name2 = prxchange("s/[^A-Za-z_]/_/",1,prxchange("s/[^A-Za-z_0-9]/_/",-1,name1));
put name2;
run;
SASのregular expression
機能の使用はどうですか?たとえば:
data names;
set name;
name_cleaned = prxchange('s/[^a-z0-9 ]/_/i', -1, name);
run;
これは_
に文字、数字、またはスペースではない何かを変換します。 9
の後ろに、リストに許可したい他の文字を追加することができます。一部の文字は「特別」で、先頭には\
が必要です。
VALIDVARNAMEシステムオプションを参照してください。有効でないSAS名を受け入れる可能性があります。
また、NOTNAME関数は、無効な文字の検索を容易にすることができます。
+1のNOTNAMEを示します。これをループで使用していたかもしれませんが、正規表現のアプローチは簡単で簡潔です。私はSASが有効な名前に使用するルールを確認するために、この関数のドキュメントを使用しました。ありがとう=) –
転置でもIDLABEL
ステートメントを使用して、元の値と一致するラベルを追加することができます。次に、VARLABEL
関数を使用してラベルを取得し、その方法で作業します。
パーフェクト - ありがとう! –