在日常的編程中咪笑,為了方便調(diào)用某些值,一個簡便的方法是將這些值賦值到宏變量中娄涩。給宏變量賦值窗怒,Data步和Proc步都能可以實現(xiàn),不過從操作靈活性上講钝满,Proc步要更勝一籌兜粘。Proc步生成宏變量就需要用到INTO子句,下面來具體介紹一下INTO子句如何使用弯蚜。
INTO子句的作用是孔轴,將PROC SQL生成的值賦值給宏變量。
語法
我們來看一下INTO子句的具體語法:
INTO : macro-variable-specification-1 <, : macro-variable-specification-2 ...>
macro-variable-specification碎捺,宏變量的說明路鹰,是要創(chuàng)建的一個或多個宏變量的名稱,并且在每個宏變量名稱前都需要添加一個冒號:
收厨。如果不添加冒號晋柱,程序運行時會報錯。
macro-variable-specification的形式
INTO語句宏變量的命名有3種形式:
- into : macro-variable(指定一個或多個宏變量)
- into : macro-variable-1 ? : macro-variable-n <NOTRIM> (指定一個宏變量序列)
- into : macro-variable SEPARATED BY 'characters ' <NOTRIM> (指定一個宏變量來保存一列的所有值)
下面我來介紹每種方式的語法和具體的代碼示例诵叁,使用的示例數(shù)據(jù)集是SASHELP.BASEBALL, 為了方便演示雁竞,我只選取數(shù)據(jù)集前4行的記錄,先看一下數(shù)據(jù)集具體的內(nèi)容:
data baseball;
set sashelp.baseball (obs =4);
run;
下面具體看每一種命名方式:
1拧额、指定一個或多個宏變量(into : macro-variable
)
使用這種命名方式碑诉,賦值給宏變量的值的前置和后置空格都會被保留。如果想要移除前置或后置空格侥锦,需要自行對所引用的值進行函數(shù)處理进栽。如果要命名多個宏變量,各個宏變量名稱之前都需要添加冒號:
恭垦,并且名稱之前都要有逗號,
間隔快毛。同時格嗅,也要注意,這種命名方式只是選取變量的一條記錄賦值給宏變量唠帝。如果所選變量有多條記錄屯掖,并且不經(jīng)過篩選的話,默認是選取第一條記錄進行賦值没隘。
賦值代碼示例:
proc sql noprint;
select name, team
into :name, :team
from baseball;
quit;
%put &name;
%put &team;
宏變量的值如下:
從結(jié)果中懂扼,我們可以看到,變量name右蒲、team的第一條記錄都被賦值到宏變量中了阀湿。
2、指定一個宏變量序列(into : macro-variable-1 ? : macro-variable-n <NOTRIM>
)
使用這種命名方式瑰妄,賦值給宏變量的值的前置和后置空格都會被自動移除陷嘴。如果項目要保留值的前置和后置空格,就需要在每個元素后面添加NOTRIM
選項间坐。如果有多個元素存在灾挨,只需要對需要保留空格的那個元素使用NOTRIM
選項。序列中有多少數(shù)目的宏變量名竹宋,就會有同樣數(shù)目的變量記錄賦值到對應(yīng)宏變量中劳澄。
賦值代碼示例:
proc sql noprint;
select name, team
into :name1- :name4 notrim, :team1 - :team3
from baseball;
quit;
考慮到有多個宏變量,我們利用SAS字典的值來查看宏變量的值:
%symdel name team;
proc sql noprint;
create table test as
select *
from dictionary.macros
where index(name, "NAME") or index(name, "TEAM")
;
quit;
輸出結(jié)果如下:
當(dāng)用宏變量序列來保存變量的值時蜈七,可以保存多個變量值秒拔。
3、指定一個宏變量來保存一列的所有值(into : macro-variable SEPARATED BY 'characters ' <NOTRIM>
)
使用這種命名方式飒硅,列表中的值將會被一個或多個字符分隔砂缩。賦值給宏變量的值的前置和后置空格都會被自動移除。如果項目要保留值的前置和后置空格三娩,也還是需要使用NOTRIM
選項庵芭。
這種命名方式便于建立一項事物的集合,比如雀监,實現(xiàn)變量可能取值的匯總:
proc sql noprint;
select distinct name
into :names separated by ','
from baseball;
quit;
%put &names;
宏變量的值如下:
再比如双吆,建立批量命名語句:
proc sql noprint;
select strip(name)||" = "||strip(name)||"_new" into :rename separated by " "
from dictionary.columns
where libname="WORK" and memname="BASEBALL";
quit;
%put &rename.;
data baseball_new;
set baseball;
rename &rename.;
run;
再比如,只保留數(shù)據(jù)集中字符型變量:
proc sql noprint;
select name into :keepnames separated by " "
from dictionary.columns
where libname="WORK" and memname="BASEBALL" and type="char";
quit;
%put &keepnames.;
data baseball1;
set baseball;
keep &keepnames.;
run;
熟悉INTO子句的用法后会前,可以根據(jù)根據(jù)任務(wù)的需求自由發(fā)揮好乐。
以上。
若有疑問回官,歡迎評論區(qū)交流曹宴!