SAS編程數(shù)據(jù)挖掘?qū)W習(xí)與幫助文檔-3_第1頁
SAS編程數(shù)據(jù)挖掘?qū)W習(xí)與幫助文檔-3_第2頁
SAS編程數(shù)據(jù)挖掘?qū)W習(xí)與幫助文檔-3_第3頁
SAS編程數(shù)據(jù)挖掘?qū)W習(xí)與幫助文檔-3_第4頁
SAS編程數(shù)據(jù)挖掘?qū)W習(xí)與幫助文檔-3_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、SAS編程與數(shù)據(jù)挖掘商業(yè)案例學(xué)習(xí)筆記之九(2013-08-07 07:41:14) 轉(zhuǎn)載標(biāo)簽: sasinfile語句數(shù)據(jù)挖掘數(shù)據(jù)分析sas編程分類: SAS編程 繼續(xù)之前的讀書筆記,廢話少說,直奔主題。本文重點(diǎn)在infile語句。十一:infile語句Dsd 規(guī)定一個數(shù)據(jù)集可以包含分隔符,但是要用引號括起來,兩個連續(xù)分隔符之間的數(shù)作為缺失值處理, 默認(rèn)分隔符為逗號Firstobs= 規(guī)定從該記錄行開始讀入Obs= 規(guī)定要讀入的記錄數(shù)Length= virable 把當(dāng)前行的數(shù)據(jù)長度賦值給臨時變量variableMissover 阻止input語句從下一數(shù)據(jù)行讀入數(shù)據(jù),為賦值的變量設(shè)置為缺失e

2、g:filename file 'f:data_modelbook_datachapt3utf.txt'data unicode;infile file encoding="utf-8"input name $ weight;run;導(dǎo)入指定編碼格式的文件eg:data num;infile datalines dsd dlm=''input x y z;datalines;2 34 5 67 9;run;對于有缺失值時,利用dsd 和dlm一起可以解決eg:data weather;infile datalines missover;inp

3、ut temp1-temp5;datalines;97.9 98.1 98.398.6 99.2 99.1 98.5 97.596.2 97.3 98.3 97.6 96.5;run;第一行后面兩個數(shù)據(jù)缺失,此時用missover強(qiáng)制數(shù)據(jù)指針必須讀完每一行對應(yīng)的所有輸入變量的值SAS編程與數(shù)據(jù)挖掘商業(yè)案例學(xué)習(xí)筆記之十(2013-08-07 12:57:22) 轉(zhuǎn)載標(biāo)簽: sas數(shù)據(jù)分析retain語句keep語句array語句分類: SAS編程 繼續(xù)之前的讀書筆記,本次講解sas主要的變量操作,包括基本賦值語句、累加語句、keep語句、retain語句、array語句、rename語句、len

4、gth語句。1.基本賦值語句z=x y;z=sum(x,y); sum函數(shù)的好處是可以克服缺失值的影響;2.如果表達(dá)式中既有數(shù)值型變量又有字符型變量的話,則會將字符型變量轉(zhuǎn)化為數(shù)值型變量3.系統(tǒng)在編譯階段,對于賦值語句變量,如果是字符型變量則長度為1,如果是數(shù)值型變量則長度為8,接下來,系統(tǒng)將執(zhí)行賦值語句,這時變量長度將由第一次讀入的表達(dá)式的運(yùn)算結(jié)果決定。一旦第一次讀入確定長度之后,下一次pdv無論讀入多長的數(shù)據(jù),都不會改變變量的長度。除非提前用length語句限定變量的長度。4.累加語句x 1,x (-1)都是累加語句,其中x必須是數(shù)值型變量,在編譯階段,pdv自動設(shè)置累加變量值為0,它的值

5、從當(dāng)前執(zhí)行后一直保留在pdv中,直到下一次執(zhí)行為止。在項(xiàng)目實(shí)踐中,一般用retain語句替代累加語句,因?yàn)閞etain語句可以初始化累加變量為一個非零值,而累積語句初始值只能為0.5.keep語句(keep語句不是可執(zhí)行語句)Data a3;set sashelp.class(keep=name weight);x=1;keep name x;Run;Data a4(keep=name x);set sashelp.class(keep=name weight);x=1;Run;以上兩個程序輸出結(jié)果一樣,但是對于讀入數(shù)據(jù)集時,keep=的形式性能要遠(yuǎn)高于keep的形式,因?yàn)閗eep=的形式是僅

6、限后面的變量進(jìn)入pdv,對于擁有幾百個變量的數(shù)據(jù)集而言,keep=效率要高;不過對于數(shù)據(jù)輸出方面,keep=與keep性能沒有區(qū)別;上面兩個語句性能完全一樣。6.retain語句(不是一個可執(zhí)行語句)pdv運(yùn)行規(guī)律:data語句與run語句構(gòu)成了一個循環(huán)語句,一般情況下每讀一遍data步所有語句時,pdv都會清空所有變量值,并設(shè)置為缺失值。然后根據(jù)執(zhí)行語句,再次對變量進(jìn)行賦值。當(dāng)data步使用retain語句時,pdv則不會清空retain語句對應(yīng)變量,而是一直保留直到下次該變量再次執(zhí)行。retain語句在data步中有著廣泛的應(yīng)用,對于數(shù)據(jù)集的操作可以到單元格,而一般函數(shù)只能操作到列,實(shí)際應(yīng)

7、用中retain會使程序更加靈活化。可以控制一個變量的值不變,除非有外部的條件的變化而變化。retain語句主要實(shí)現(xiàn)以下需求:匯總數(shù)據(jù),累加變量,縱向比較變量,創(chuàng)建flag標(biāo)識變量,處理缺失值,迭代累加字符變量值。Eg:關(guān)于匯總數(shù)據(jù)的一個例子(按照每個id,匯總cns的值,匯總id的記錄數(shù),如果txn_cde變量取101和201兩個值,則累加計(jì)算一次,計(jì)算txn_dte的最小值,)libname chapt4 "f:data_modelbook_datachapt4"data chapt4.retain1;input id txn_cde$ cns txn_dte$;car

8、ds;10 101 10 2007010110 101 20 2008040210 201 30 2005020320 101 40 2004010520 201 50 2004010520 301 60 2007080620 201 70 2005060730 301 80 2007050130 401 90 20070306;run;proc sort data= chapt4.retain1;by id txn_dte;run;data test1;set chapt4.retain1;by id txn_dte; - 按照id txn_dte排序后逐條讀取數(shù)據(jù)retain min_dt

9、e sum_cns cnt cnt_condition;if first.id then do; -由于賦值語句比較多,需要用do語句套住所有的賦值語句,不是循環(huán)。min_dte=txn_dte;sum_cns=0;cnt=0;cnt_condition=0;end;min_dte=min(min_dte,txn_dte);sum_cns cns;cnt 1;cnt_condition (txn_cde in("101" "201");if last.id; -只有每次id對應(yīng)數(shù)據(jù)讀完后才會執(zhí)行此舉。run;整個程序分為5個模塊,Set/by模塊:set

10、語句是讀數(shù)據(jù)集,必不可少,一定注意by語句不能丟,by后面的變量就是之前排序中的變量。retain模塊:對需要retain的變量進(jìn)行聲明first模塊:對retain變量按照每一個first.id做初始化主體模塊:該模塊介于first與last之間,主要是完成對需求的運(yùn)算last模塊:該模塊主要完成最后的輸出。7.array語句array在sas中其實(shí)是一個變量指針,他真用內(nèi)存空間約4B,其作用是指向需要操作的變量對象,array可以把無序的無規(guī)則的變量名統(tǒng)一,常用的array語句:Array rain5 x1-x5; 數(shù)組中有5個元素,分別為x1-x5Array ar(3); 輸出變量默認(rèn)為

11、ar1-ar3Array ar(1:3) 等價(jià)于上一個Array x1:5,1:3 score1-score15; 規(guī)定一個5*3二維數(shù)組,score1-score15一次逐行放入數(shù)組Array ab(*) x y z; 等價(jià)于array ab(3) x y z;Array test(3) _temporary_ (90 80 70)Array days7 d1-d7 (1,2,3,4,5,6,7);數(shù)組函數(shù):維度函數(shù)dim(),array mult 5,10,2 mult1-mult100,dim(mult)=dim(mult,1)=5Dim2(mult)=dim(mult,2)=10Dim

12、3(mult)=dim(mult,3)=100Eg:options pageno=1 nodate ps=64 ls=80;data temp;input x ;cards;10 20 30;run;data test (drop=i);set temp;array a(5) A1-A5;do i=1 to 5;a(i)=i;end;run;proc print noobs data=test;run;總結(jié):array其實(shí)是一個橫向操作語句,也就是說,當(dāng)數(shù)據(jù)指針停留在某一條觀測時,可以通過array語句,把所有的array聲明的變量都操作一遍。商業(yè)實(shí)戰(zhàn):缺失值的填充;data missing;

13、input x y$ z$ m;cards;. . . 12 . 3 .;run;data result;set missing;array char _character_;array numr _numeric_;do over char;if char eq "" then char="null"end;do over numr;if numr eq . then numr=0;end;run;對于所有的字符型變量。缺失時都賦值為null。對于所有的數(shù)字型變量,缺失事都賦值為0常見累加器,比如統(tǒng)計(jì)價(jià)格人數(shù)data score;input id$ x

14、 y z;cards;a 75 84 65b 54 74 71c 51 56 52d 50 50 60;run;data qualify;set score;k=0; array chengji(3) x y z;array base(3)_temporary_(60,60,60);do i=1 to 3;if chengji(i) ge base(i) then k 1; end;if k=3 then output qualify;run;統(tǒng)計(jì)所有成績都及格的學(xué)生記錄。橫向排序變量data a;input x1-x7;cards;23 44 81 13 42 34 2614 18 10 2

15、0 33 11 50;run;data final;set a;array arr(1:7) x:;array copy(1:7) cx1-cx7;do m=1 to dim(arr);copy(m)=arr(m);end;do i=1 to dim(copy);do j=i 1 to dim(copy);if copy(j)>copy(i) then do;temp=copy(j);copy(j)=copy(i);copy(i)=temp;end;end;end;run;利用冒泡算法實(shí)現(xiàn)橫向排序縱向橫向綜合應(yīng)用:刪除缺失值比例超過一定閾值的變量列表:options symbolgen;

16、data missing;input n1 n2 n3 n4 n5 n6 n7 n8 c1$ c2$ c3$ c4$;datalines;1 . 1 . 1 . 1 4 a . c .1 1 . . 2 . . 5 e . g h1 . 1 . 3 . . 6 . . k l1 . . . . . . . a b c d;data _null_;if 0 thenset missing nobs=obs;array num_vars* _NUMERIC_;array char_vars* _CHARACTER_;call symputx('num_qty', dim(num_v

17、ars);call symputx('char_qty', dim(char_vars);call symputx('m_obs',obs);stop;run;%put &num_qty &char_qty &m_obs;data _null_;set missing end=finished;array num_vars* _NUMERIC_;array char_vars* _CHARACTER_;array num_miss &num_qty (&num_qty * 0);array char_miss &c

18、har_qty (&char_qty * 0);length list $ 50;do i=1 to dim(num_vars);if num_vars(i) eq . then num_miss(i) 1;end;do i=1 to dim(char_vars);if char_vars(i) eq '' then char_miss(i) 1;end;if finished then do;do i= 1 to dim(num_vars);if num_miss(i)/&m_obs. ge 0.7 then list=trim(list)|' 

19、9;|trim(vname(num_vars(i);end;do i= 1 to dim(char_vars);if char_miss(i)/&m_obs. ge 0.7 then list=trim(list)|' '|trim(vname(char_vars(i);end;call symputx('mlist',list);end;run;%put &mlist;data notmiss;set missing(drop=&mlist);run;這是一個典型的array語句和retain語句綜合應(yīng)用的例子第一個_null_程序,區(qū)

20、分并計(jì)算所有數(shù)值型和字符型變量的個數(shù),并把結(jié)果賦值給兩個不同的宏變量;同時獲取數(shù)據(jù)集missing的觀測數(shù),也賦值給另外一個宏變量m_obs;整個程序都是在編譯階段完成的,沒有任何的執(zhí)行語句,這是為了提高效率,第二步,對數(shù)值型和字符型分布計(jì)算每一個變量的缺失值個數(shù),并累加,最后根據(jù)預(yù)設(shè)的閾值,找到滿足的所有變量,并賦值給宏變量mlist第三步:data步,drop滿足條件的變量。第二步說明“:編譯過程聲明了四個數(shù)組,num_vars指向所有的數(shù)值型變量(n1-n8),使用_numeric_故不再輸出數(shù)據(jù)集中顯示char_vars指向所有的數(shù)值型變量(c1-c8),使用_character_故不

21、再輸出數(shù)據(jù)集中顯示數(shù)組num_miss,默認(rèn)變量名是num_miss1-num_miss8,并設(shè)置初始值為0;數(shù)組char_miss,默認(rèn)變量名是char_miss1-char_miss8,并設(shè)置初始值為0;接下來程序讀取數(shù)據(jù)集missing第一條觀測,執(zhí)行兩個do語句,第一個do語句,獲得num_miss1=0,num_miss2=1,num_miss8=1第二個do語句,獲得char_miss1=接下來,判斷if finished語句,由于還沒有讀到文件末尾,所以程序不會執(zhí)行該語句,直接run語句,輸出第一條觀測,程序調(diào)回data開頭,繼續(xù)執(zhí)行下一個觀測,依次下去,知道最后一條記錄。然后執(zhí)

22、行if finshed語句,完成最后兩個do語句:第三個do語句,執(zhí)行8次,如果缺失值超過70%,則執(zhí)行l(wèi)ist=trim(list)|' '|trim(vname(num_vars(i),從而獲取全部的缺失值大于70%的數(shù)值型變量;第四個do語句,同樣的道理最后總結(jié),array語句在處理橫向操作方面功能非常龐大,只要有array出現(xiàn)的地方,就要有do語句,8.rename語句Rename old_name=new_name;注意:rename語句是一個聲明語句,不是賦值語句rename語句如果和keep語句同時出現(xiàn)的時候,系統(tǒng)先編譯keep語句,后編譯rename語句。dro

23、p類似于keep語句。eg:data a;input x y;cards;1 2;data b;set a;rename y=yy;keep x y;run;9.length語句Length m1 3 m2 $8;Length m1 m2 7;都是合法的length語句可以改變原有數(shù)據(jù)集變量的長度。對于字符型變量,語句要在set語句之前,對于數(shù)值型變量,可以在任何地方,10.label語句Label x1='ab' x2='cd'SAS編程與數(shù)據(jù)挖掘商業(yè)案例學(xué)習(xí)筆記之十一(2013-08-07 18:10:27) 轉(zhuǎn)載標(biāo)簽: sasoutput語句sas編程pd

24、vwhere和if語句分類: SAS編程 繼續(xù)讀書筆記,本文重點(diǎn)側(cè)重sas觀測值的操作方面, 主要包括:輸出觀測值、更新觀測值、刪除觀測值、停止輸出觀測值等1.output語句 輸出當(dāng)前在pdv中的觀測值,繼續(xù)無條件執(zhí)行下面的語句。注意:簡單的data步不需要output語句,run語句會自動輸出pdv中的數(shù)據(jù)到數(shù)據(jù)集,并返回data步開頭繼續(xù)執(zhí)行下一條觀測。在有output語句和run語句同時存在時,pdv只會執(zhí)行output的結(jié)果到正在被創(chuàng)建的數(shù)據(jù)集,而執(zhí)行run語句的結(jié)果是pdv會清空所有的變量值為缺失值data a;input id x1-x3;cards;101 10 20 3010

25、2 40 50 60;data b;set a;x=x1;output;x=x2;output;x=x3;output;output;run;由于data步包含四個output語句,因此每次讀入一條觀測,程序會執(zhí)行output語句,總共會輸出8條記錄data out1 out2;set sashelp.class;if _n_ le 7 then output out1;else output out2;run;if條件的output語句,只有滿足if條件時pdv才把得到的結(jié)果輸出到正在被創(chuàng)建的數(shù)據(jù)集data a;input x y ;cards;1 10 1 20 1 200 2 30 2

26、403 50 3 60 4 70 3 80 4 400;proc sort data=a;by x;run;data b;set a;by x;retain rt;if first.x then rt=0;if last.x then output;rt=y;run;輸出by變量的last觀測值,并保留last最近前一條觀測變量值。該例中output與run同時出現(xiàn)時,值輸出output后面的,不管output前面的條件是否成立;執(zhí)行run語句的結(jié)果是PDV會清空所有的變量值為缺失。是對每一個by組進(jìn)行循環(huán)的,且first.x也是針對by組的2.if語句 是一個可執(zhí)行語句,將滿足條件的觀測值輸

27、出到正在被創(chuàng)建的數(shù)據(jù)集中3.where語句 不是一個可執(zhí)行語句,判斷條件是在pdv之前注:不能使用自動變量_n_或者其他選項(xiàng)如obs,point與where語句一起使用。因?yàn)閣here語句是在pdv之前使用where語句必須保證讀入數(shù)據(jù)集的完整性,不能使用如firstobs=2等不能完整讀入數(shù)據(jù)集的選項(xiàng)對同一數(shù)據(jù)集,同時使用where語句和where=選項(xiàng),則系統(tǒng)只使用where=選項(xiàng),而不考慮where語句where語句和by語句一起出現(xiàn)時,先執(zhí)行where語句,然后在by語句,by組對執(zhí)行完畢后的數(shù)據(jù)集重新定義first/lastWhere語句和if語句 區(qū)別1.where語句是在觀測進(jìn)入

28、pdv之前起作用,而if語句是在pdv中的觀測起作用。2.where語句不是一個可執(zhí)行語句,而子集if語句是可執(zhí)行語句3.where語句有自己特有的表達(dá)式,而if語句使用通用的sas表達(dá)式4.where語句比if效率高4.replace語句和remove語句和output語句這兩個語句只能跟modify一起使用,數(shù)據(jù)集:libname chapt5 "f:data_modelbook_datachapt5"data chapt5.a;input x y ;cards;1 10 2 20 3 30 4 40;run;libname chapt5 "f:data_mo

29、delbook_datachapt5"data chapt5.b;input x y ;cards;3 300 4 400 5 500;run;eg:data chapt5.a;modify chapt5.a chapt5.b;by x;if _iorc_=0 then replace;else _error_=0;run;對匹配到的數(shù)據(jù),更新數(shù)據(jù)集將覆蓋主數(shù)據(jù)集,對于未匹配到的數(shù)據(jù),不予考慮data chapt5.a;modify chapt5.a chapt5.b;by x;if _iorc_=0 then replace;else do; _error_=0;output;en

30、d;run;對匹配到的數(shù)據(jù),更新數(shù)據(jù)集將覆蓋主數(shù)據(jù)集,對于未匹配到的數(shù)據(jù),將更新數(shù)據(jù)集數(shù)據(jù)也輸出到主數(shù)據(jù)集中data chapt5.a;modify chapt5.a chapt5.b;by x;if _iorc_=0 then remove;else _error_=0;run;對于匹配到的數(shù)據(jù)從主數(shù)據(jù)中刪除5.delete語句和stop語句data a;set sashelp.class;if sex eq "M" then delete;run;刪除部分觀測,以下代碼目的一樣data a;set sashelp.class;if sex ne "M"

31、;run;data a;set sashelp.class;if _n_ ge 3 then stop;run;stop直接跳出data,最終數(shù)據(jù)集a只有兩條觀測SAS編程與數(shù)據(jù)挖掘商業(yè)案例學(xué)習(xí)筆記之十二(2013-08-07 21:21:30) 轉(zhuǎn)載標(biāo)簽: sasappend語句transpose語句sort語句數(shù)據(jù)挖掘分類: SAS編程 本次重點(diǎn)在:sas數(shù)據(jù)集管理 主要包括:包括數(shù)據(jù)集縱向拼接、轉(zhuǎn)置、排序、比較、復(fù)制、重命名、刪除等1.append語句注:base數(shù)據(jù)集和data兩個數(shù)據(jù)集必須結(jié)構(gòu)一樣,避免使用force的情況,重復(fù)append的會造成重復(fù)。一個避免重復(fù)的商業(yè)化應(yīng)用:%m

32、acro dl;%if %sysfunc(exist(null) ne 0 %then %do;proc datasets lib=work nolist;delete null;quit;%end;proc append base=null data=sashelp.class;run;%mend dl;%dl;如果數(shù)據(jù)集null存在,則進(jìn)行刪除,否則直接append另一個使用的例子;data _null_;x=today();format x yymmdd10.;call symput('data_month',put(intnx("month",x,0

33、),yymmn6.);run;%put &data_month;data a;input month$ var;cards;200908 10200909 20200910 30200911 40;data b;input month$ var;cards;200911 400;data a;modify a;if month="&data_month" then remove;run;proc append base=a data=b;run;第一部分:獲取當(dāng)前月第二部分:刪除當(dāng)前月數(shù)據(jù)第三部分:append到數(shù)據(jù)a其中第二部分可以用以下兩個語句替代,但是

34、效率最高的是remove,效率最低的是sql。data a;set a;if month="&data_month" then delete;run;proc sql;delete from awhere month="&data_month"quit;2.sort語句常用選項(xiàng):nodupkey:刪除重復(fù)by值對應(yīng)的觀測noduprecs:刪除重復(fù)觀測值Descending 一定要放在降序排序的變量前。Eg:data a;input x y ;cards;1 20 1 10 1 30 2 40 2 50;run;proc sort dat

35、a=a nodupkey; by x;run;只取排序變量的每一個by組的第一條觀測值上述代碼也可以用以下代替:proc sort data=a ; by x;run;data b;set a;by x;if first.x;run;返回每一個by組里面y最小的,proc sort data=a; by x y;run;proc sort data=a nodupkey; by x;run;也可以用data步完成:proc sort data=a; by x y;run;data b;set a;by x y;if first.x;run;注:如果使用了nodupkey選項(xiàng),最好使用out=選項(xiàng),否則原有數(shù)據(jù)集會被刪除掉一部分。對于多個字符變量需要sort的情況下,sort前先用catt之類的字符拼接函數(shù)拼

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論