SAS中有一種簡單的方法將字符串轉換爲可用作列名的SAS安全名稱嗎?SAS安全列名稱
即。
Rob Penridge ----> Rob_Penridge
$*@'[email protected]* ----> ____Blah__
我使用的是proc transpose
,然後想在轉置後使用重命名的列。
SAS中有一種簡單的方法將字符串轉換爲可用作列名的SAS安全名稱嗎?SAS安全列名稱
即。
Rob Penridge ----> Rob_Penridge
$*@'[email protected]* ----> ____Blah__
我使用的是proc transpose
,然後想在轉置後使用重命名的列。
proc transpose
將這些名稱沒有任何修飾,只要你設置options validvarname=any;
如果你想以後用列工作,你可以使用NLITERAL功能來構建名爲文字可以用來指他們:
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使用有效名稱的規則,儘管如此謝謝=) – 2012-01-30 15:28:03
您也可以在轉置中使用IDLABEL
語句來添加與原始值匹配的標籤。然後使用VARLABEL
函數檢索標籤並以這種方式處理它們。
完美 - 謝謝! – 2012-01-31 18:23:48