SAS學(xué)習(xí)筆記 宏變量賦值

SAS給宏變量賦值大體來說其實就3種方式:%let語句、data步中的call symput語句proc sql過程中into語句堤魁。
這里根據(jù)變量和觀測的數(shù)量分情況進(jìn)行如下討論,即:

  • 單變量單觀測變單宏變量
  • 單變量單觀測變多宏變量
  • 單變量多觀測變多宏變量

單變量單觀測變單宏變量

提出問題如下:

/*problem1:將組名信息賦值給宏變量group都弹,各組之間\分割,單變量一觀測變一宏變量*/

數(shù)據(jù)集如下:

data example1;
    group  = "太極組\圍棋組\古箏組\書法組";
run;
example1數(shù)據(jù)集

分別使用如下3種方法進(jìn)行宏變量賦值:

/*method1: let statement*/

%let group1 = 太極組\圍棋組\古箏組\書法組;

%put &group1.;
日志信息

/*method2:data步 call symput statement*/
data _null_;
    set example1;
    call symput("group2",group);
run;

%put &group2.;

日志信息

/*method3:proc sql statement*/

proc sql;
     select group  into: group3
     from example1 
     ;
quit;

%put &group3.;
日志信息

  • 說明
proc sql;
/*    create table macros as*/
    select *
    from dictionary.macros
    ;
quit;

上述語句是獲得環(huán)境中macros變量信息的語句,很實用炬搭。

在單變量賦值單宏變量時,%let語句相比其他兩種要簡單穆桂,不必基于數(shù)據(jù)集宫盔;而proc sql語句則必須基于數(shù)據(jù)集中的變量產(chǎn)生;call symput則均可以實現(xiàn)享完。


單變量單觀測變多宏變量

  • 問題
/*problem2:將組名信息分別依次賦值給宏變量term1灼芭,term2,...般又,單變量一觀測變多宏變量*/
  • 數(shù)據(jù)集如下:
data example2;
    group  = "太極組\圍棋組\古箏組\書法組";
run;
xample2數(shù)據(jù)集

分別使用如下3種方法進(jìn)行宏變量賦值:

/*method1: let statement*/
%let term1_1 = 太極組;
%let term1_2 = 圍棋組;
%let term1_3 = 古箏組;
%let term1_4 = 書法組;

%macro batch;
%do i = 1 %to 4;
    %let _term1_&i. = %qscan("太極組\圍棋組\古箏組\書法組" , &i. , "\");
%end;

proc sql;
/*    create table macros as*/
    select *
    from dictionary.macros
    where scope = "BATCH"
    ;
quit;
%mend;
%batch;
batch宏批量處理后打印結(jié)果

/*method2:data步 call symput statement*/

data _null_;
   set example2
    do i = 1 to 4;
        call symput(cats("term2_", put(i , best.)) , scan(group , i, "\") );
    end;
run;
打印結(jié)果

/*method3:proc sql statement*/
data m3;
   set example2
    array term (4) $ term1 - term4;
    do i =1 to 4;
        term(i) = scan(group , i, "\") ;
    end;
run;

proc sql;
     select  term1, term2, term3, term4  into :term3_1  ,:term3_2 ,:term3_3,:term3_4
     from m3
     ;
quit;

proc sql;
/*    create table macros as*/
    select *
    from dictionary.macros
    ;
quit;
打印結(jié)果

  • 說明
  1. 這種情況就可以看出 %let語句的劣勢了彼绷,無法批量操作,為了批量操作我寫了個簡單宏才實現(xiàn)茴迁;
  2. call symput語句的實現(xiàn)則很簡單寄悯,這是因為只涉及到單個變量的操作,是data步的優(yōu)勢所在堕义,代碼量很少猜旬;
  3. proc sql給宏變量賦值的優(yōu)勢在這里體現(xiàn)的不明顯,但是也可以看出它針對數(shù)據(jù)集層面倦卖,批量化宏變量賦值操作的便捷性洒擦。

單變量多觀測變多宏變量

  • 問題
/*problem3:將分組變量中組名觀測依次賦值給宏變量term1,term2怕膛,...熟嫩,單變量多觀測變多宏變量*/
  • 數(shù)據(jù)集
data example3;
    length group $200.;
    input group;
cards;
太極組
圍棋組
古箏組
書法組
;
proc print;
run;

example3打印結(jié)果

  • 使用3種方法賦值宏變量
/*method1:%let statement*/

proc transpose data= example3 out=_out3;
    var group;
run;

%macro m1;
    data test;
        set _out3;
        call symput("group" ,catx("\", of col1 - col4) );
    run;
    %do i = 1 %to 4;
       %let _1term_&i. = %qscan( "&group.", &i.,"\");
    %end;
    proc sql;
        create table macros as
        select *
        from dictionary.macros
        where scope = "M1"
        ;
    quit;
%mend;
%m1;
_out3輸出
復(fù)制后宏變量結(jié)果輸出

使用%let解決這個問題,需要先轉(zhuǎn)置褐捻,使問題變?yōu)榛谧兞康簿褪橇幸蔚耍瑥浹a(bǔ)基礎(chǔ)語句基于觀測處理問題能力偏弱的短板
然后構(gòu)建宏昧狮,在宏里還要再把數(shù)據(jù)集里的多個變量賦值為單個宏變量景馁,這是因為%let是在變量層面解決問題的,數(shù)據(jù)集無處下爪陵且;
之后使用循環(huán),彌補(bǔ)%let批量處理問題的短板个束。


/*method2:call symput statement*/
proc transpose data= example3 out=_out3;
    var group;
run;

data M2;
    set _out3;
    array terms(4) col1 -col4;
    do i = 1 to 4;
        call symput(cats("_2term_", put(i , best.)),terms(i) );
    end;
run;

proc sql;
    select *
    from dictionary.macros
    ;
quit;
打印結(jié)果
  • 說明

可以看到慕购,使用call symput解決這個問題,同樣需要經(jīng)歷轉(zhuǎn)置步驟轉(zhuǎn)變?yōu)樘幚碜兞康膯栴}茬底;然后在data步使用數(shù)組循環(huán)沪悲,還是比較繁瑣的。

  • proc sql的優(yōu)勢就體現(xiàn)出來了阱表,一個代碼塊就達(dá)成目的殿如,如下:

/*method3:proc sql statement*/
/*單變量多觀測變多個宏變量*/
proc sql;
     select  group  into :_3term1 -: _3term99
     from example3
     ;
quit;

/*單變量多觀測變一宏變量*/
proc sql;
     select  group  into :_3term separated by " "
     from example3
     ;
quit;

proc sql;
/*    create table macros as*/
    select *
    from dictionary.macros
    ;
quit;
打印結(jié)果

  • 說明
  1. 這種情況%let的實現(xiàn)一樣要借助于宏,并且因為涉及到了數(shù)據(jù)集層面的操作最爬,%let就更加不太擅長了涉馁;
  2. 同時,call symput的實現(xiàn)也不太容易爱致,SAS data長于變量操作弱于觀測操作的弊端便體現(xiàn)出來了烤送。
  3. 在這種情況下,proc sql的批量化和觀測層面操作的優(yōu)勢便體現(xiàn)出來了糠悯,如果是有多變量多觀測賦值多宏變量的情況帮坚,那proc sql的優(yōu)勢就會更加明顯了;

proc sql給宏變量賦值的情況大致可以分為如下幾種情況

  1. 單變量單個觀測值賦值給單個宏變量:proc sql; select var into :mvar from dtin ; quit;互艾,這種情況用proc sql不具有優(yōu)勢试和;

  1. 多變量單觀測值賦值給多個宏變量:proc sql; select var1, var2, var3, var4 into :mvar1, mvar2, mvar3, mvar4 from dtin ; quit;

  1. 單變量多觀測賦值給多個宏變量:proc sql; select var1into :mvar1 -:mvar99 from dtin ; quit;,其中,mvar99中的數(shù)值設(shè)置的較大值纫普,是在未知觀測值數(shù)量時的簡便做法阅悍;

  1. 單變量多觀測賦值給單個宏變量:proc sql; select var1into :mvar separated by "sep" from dtin ; quit;,其中,sep是分隔符昨稼;

  1. 多變量多觀測值賦值給多個宏變量:proc sql; select var1, var2, var3, var4 into :var1m1 -:var1m99, var2m1 -:var2m99, var3m1 -:var3m99, var4m1 -:var4m99 from dtin ; quit;溉箕,其中的4個變量均有多個觀測值;
  • 舉例
proc sql;
    select name, weight, height into :name1 -:name99,
     :weight1 -:weight99, 
     :height1 -: height99
    from sashelp.class(where = (sex = "女"))
    ;
quit;
情況5 結(jié)果輸出

  1. 多變量多觀測值賦值給多個宏變量悦昵,但變量內(nèi)觀測值拼接:proc sql; select var1, var2, var3, var4 into :var1m1 -:var1m99, var2m1 -:var2m99, var3m1 -:var3m99, var4m1 -:var4m99 from dtin ; quit;肴茄,其中的4個變量均有多個觀測值;
proc sql;
    select name, weight, height into :name separated by " ", :weight separated by " " ,:height separated by " "
    from sashelp.class(where = (sex = "女"))
    ;
quit;
情況6 舉例輸出

總結(jié)

不涉及數(shù)據(jù)集的單變量的宏變量賦值但指,%let很實用寡痰;
基于數(shù)據(jù)集且多在變量層面操作抗楔,call symputproc sql均適用;
基于數(shù)據(jù)集且涉及多個變量和觀測層面的操作拦坠,proc sql比較有優(yōu)勢连躏,其他兩種實現(xiàn)起來就需要更多的代碼量;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贞滨,一起剝皮案震驚了整個濱河市入热,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晓铆,老刑警劉巖勺良,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骄噪,居然都是意外死亡尚困,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門链蕊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來事甜,“玉大人,你說我怎么就攤上這事滔韵÷咔” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵陪蜻,是天一觀的道長跨跨。 經(jīng)常有香客問我,道長囱皿,這世上最難降的妖魔是什么勇婴? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮嘱腥,結(jié)果婚禮上耕渴,老公的妹妹穿的比我還像新娘。我一直安慰自己齿兔,他們只是感情好橱脸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著分苇,像睡著了一般添诉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上医寿,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天栏赴,我揣著相機(jī)與錄音,去河邊找鬼靖秩。 笑死须眷,一個胖子當(dāng)著我的面吹牛竖瘾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播花颗,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼捕传,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扩劝?” 一聲冷哼從身側(cè)響起庸论,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棒呛,沒想到半個月后聂示,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡条霜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年催什,在試婚紗的時候發(fā)現(xiàn)自己被綠了涵亏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宰睡。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖气筋,靈堂內(nèi)的尸體忽然破棺而出拆内,到底是詐尸還是另有隱情,我是刑警寧澤宠默,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布麸恍,位于F島的核電站,受9級特大地震影響搀矫,放射性物質(zhì)發(fā)生泄漏抹沪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一瓤球、第九天 我趴在偏房一處隱蔽的房頂上張望融欧。 院中可真熱鬧,春花似錦卦羡、人聲如沸噪馏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欠肾。三九已至,卻和暖如春拟赊,著一層夾襖步出監(jiān)牢的瞬間刺桃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工吸祟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虏肾,地道東北人廓啊。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像封豪,于是被迫代替她去往敵國和親谴轮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容