SAS編程:Proc SQL生成宏變量時(shí)INTO子句的使用

在日常的編程中,為了方便調(diào)用某些值,一個(gè)簡便的方法是將這些值賦值到宏變量中。給宏變量賦值,Data步和Proc步都能可以實(shí)現(xiàn),不過從操作靈活性上講,Proc步要更勝一籌。Proc步生成宏變量就需要用到INTO子句,下面來具體介紹一下INTO子句如何使用。

INTO子句的作用是,將PROC SQL生成的值賦值給宏變量。

語法

我們來看一下INTO子句的具體語法:

INTO : macro-variable-specification-1 <, : macro-variable-specification-2 ...>

macro-variable-specification,宏變量的說明,是要?jiǎng)?chuàng)建的一個(gè)或多個(gè)宏變量的名稱,并且在每個(gè)宏變量名稱前都需要添加一個(gè)冒號(hào):。如果不添加冒號(hào),程序運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。

macro-variable-specification的形式

INTO語句宏變量的命名有3種形式:

  1. into : macro-variable(指定一個(gè)或多個(gè)宏變量)
  2. into : macro-variable-1 ? : macro-variable-n <NOTRIM> (指定一個(gè)宏變量序列)
  3. into : macro-variable SEPARATED BY 'characters ' <NOTRIM> (指定一個(gè)宏變量來保存一列的所有值)

下面我來介紹每種方式的語法和具體的代碼示例,使用的示例數(shù)據(jù)集是SASHELP.BASEBALL, 為了方便演示,我只選取數(shù)據(jù)集前4行的記錄,先看一下數(shù)據(jù)集具體的內(nèi)容:

data baseball;
  set sashelp.baseball (obs =4);
run;
Baseball

下面具體看每一種命名方式:

1、指定一個(gè)或多個(gè)宏變量(into : macro-variable

使用這種命名方式,賦值給宏變量的值的前置和后置空格都會(huì)被保留。如果想要移除前置或后置空格,需要自行對(duì)所引用的值進(jìn)行函數(shù)處理。如果要命名多個(gè)宏變量,各個(gè)宏變量名稱之前都需要添加冒號(hào):,并且名稱之前都要有逗號(hào),間隔。同時(shí),也要注意,這種命名方式只是選取變量的一條記錄賦值給宏變量。如果所選變量有多條記錄,并且不經(jīng)過篩選的話,默認(rèn)是選取第一條記錄進(jìn)行賦值。

賦值代碼示例:

proc sql noprint;
 select name, team
   into :name, :team
   from baseball;
quit;

%put &name;
%put &team;

宏變量的值如下:


&name
&team

從結(jié)果中,我們可以看到,變量name、team的第一條記錄都被賦值到宏變量中了。

2、指定一個(gè)宏變量序列(into : macro-variable-1 ? : macro-variable-n <NOTRIM>

使用這種命名方式,賦值給宏變量的值的前置和后置空格都會(huì)被自動(dòng)移除。如果項(xiàng)目要保留值的前置和后置空格,就需要在每個(gè)元素后面添加NOTRIM選項(xiàng)。如果有多個(gè)元素存在,只需要對(duì)需要保留空格的那個(gè)元素使用NOTRIM選項(xiàng)。序列中有多少數(shù)目的宏變量名,就會(huì)有同樣數(shù)目的變量記錄賦值到對(duì)應(yīng)宏變量中。

賦值代碼示例:

proc sql noprint;
 select name, team
   into :name1- :name4 notrim, :team1 - :team3
   from baseball;
quit;

考慮到有多個(gè)宏變量,我們利用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é)果如下:


Output2

當(dāng)用宏變量序列來保存變量的值時(shí),可以保存多個(gè)變量值。

3、指定一個(gè)宏變量來保存一列的所有值(into : macro-variable SEPARATED BY 'characters ' <NOTRIM>

使用這種命名方式,列表中的值將會(huì)被一個(gè)或多個(gè)字符分隔。賦值給宏變量的值的前置和后置空格都會(huì)被自動(dòng)移除。如果項(xiàng)目要保留值的前置和后置空格,也還是需要使用NOTRIM選項(xiàng)。

這種命名方式便于建立一項(xiàng)事物的集合,比如,實(shí)現(xiàn)變量可能取值的匯總:

proc sql noprint;
  select distinct name
    into :names separated by ','
    from baseball;
quit;

%put &names;

宏變量的值如下:


Output 3.1

再比如,建立批量命名語句:

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;
Output 3.2.1
Output 3.2.2

再比如,只保留數(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;
Output 3.3.1
Output3.3.2

熟悉INTO子句的用法后,可以根據(jù)根據(jù)任務(wù)的需求自由發(fā)揮。

以上。

若有疑問,歡迎評(píng)論區(qū)交流!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    余生動(dòng)聽閱讀 10,798評(píng)論 0 11
  • 彩排完,天已黑
    劉凱書法閱讀 4,452評(píng)論 1 3
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,445評(píng)論 2 7

友情鏈接更多精彩內(nèi)容