日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《SAS编程与数据挖掘商业案例》学习笔记之十

發(fā)布時間:2023/12/4 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《SAS编程与数据挖掘商业案例》学习笔记之十 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

繼續(xù)之前的讀書筆記,本次講解sas主要的變量操作,包括基本賦值語句、累加語句、keep語句、retain語句、array語句、rename語句、length語句。


1.基本賦值語句

z=x y;

z=sum(x,y);??sum函數(shù)的好處是可以克服缺失值的影響;

?

2.如果表達式中既有數(shù)值型變量又有字符型變量的話,則會將字符型變量轉化為數(shù)值型變量

3.系統(tǒng)在編譯階段,對于賦值語句變量,如果是字符型變量則長度為1,如果是數(shù)值型變量則長度為8,接下來,系統(tǒng)將執(zhí)行賦值語句,這時變量長度將由第一次讀入的表達式的運算結果決定。一旦第一次讀入確定長度之后,下一次pdv無論讀入多長的數(shù)據(jù),都不會改變變量的長度。除非提前用length語句限定變量的長度。

?

4.累加語句

x 1,x (-1)都是累加語句,其中x必須是數(shù)值型變量,在編譯階段,pdv自動設置累加變量值為0,它的值從當前執(zhí)行后一直保留在pdv中,直到下一次執(zhí)行為止。

在項目實踐中,一般用retain語句替代累加語句,因為retain語句可以初始化累加變量為一個非零值,而累積語句初始值只能為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;

以上兩個程序輸出結果一樣,

但是對于讀入數(shù)據(jù)集時,keep=的形式性能要遠高于keep的形式,因為keep=的形式是僅限后面的變量進入pdv,對于擁有幾百個變量的數(shù)據(jù)集而言,keep=效率要高;

不過對于數(shù)據(jù)輸出方面,keep=keep性能沒有區(qū)別;上面兩個語句性能完全一樣。

6.retain語句(不是一個可執(zhí)行語句

pdv運行規(guī)律:data語句與run語句構成了一個循環(huán)語句,一般情況下每讀一遍data步所有語句時,pdv都會清空所有變量值,并設置為缺失值。然后根據(jù)執(zhí)行語句,再次對變量進行賦值。當data步使用retain語句時,pdv則不會清空retain語句對應變量,而是一直保留直到下次該變量再次執(zhí)行。

retain語句在data步中有著廣泛的應用,對于數(shù)據(jù)集的操作可以到單元格,而一般函數(shù)只能操作到列,實際應用中retain會使程序更加靈活化??梢钥刂埔粋€變量的值不變,除非有外部的條件的變化而變化。

retain語句主要實現(xiàn)以下需求:

匯總數(shù)據(jù),累加變量,縱向比較變量,創(chuàng)建flag標識變量,處理缺失值,迭代累加字符變量值。

Eg:關于匯總數(shù)據(jù)的一個例子(按照每個id,匯總cns的值,匯總id的記錄數(shù),如果txn_cde變量取101201兩個值,則累加計算一次,計算txn_dte的最小值,)

libname chapt4 "f:\data_model\book_data\chapt4";

data chapt4.retain1;

input id txn_cde$ cns txn_dte$;

cards;

10 101 10 20070101

10 101 20 20080402

10 201 30 20050203

20 101 40 20040105

20 201 50 20040105

20 301 60 20070806

20 201 70 20050607

30 301 80 20070501

30 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_dte 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對應數(shù)據(jù)讀完后才會執(zhí)行此舉。

run;

整個程序分為5個模塊,

Set/by模塊:set語句是讀數(shù)據(jù)集,必不可少,一定注意by語句不能丟,by后面的變量就是之前排序中的變量。

retain模塊:對需要retain的變量進行聲明

first模塊:對retain變量按照每一個first.id做初始化

主體模塊:該模塊介于firstlast之間,主要是完成對需求的運算

last模塊:該模塊主要完成最后的輸出。

?

7.array語句

arraysas中其實是一個變量指針,他真用內存空間約4B,其作用是指向需要操作的變量對象,array可以把無序的無規(guī)則的變量名統(tǒng)一,

常用的array語句:

Array??rain{5}???x1-x5;???數(shù)組中有5個元素,分別為x1-x5

Array??ar(3);????輸出變量默認為ar1-ar3

Array??ar(1:3)??等價于上一個

Array??x{1:5,1:3}??score1-score15;??規(guī)定一個5*3二維數(shù)組,score1-score15一次逐行放入數(shù)組

Array??ab(*)??x y z;?????等價于array ab(3)??x y z;

Array??test(3) _temporary_??(90??80??70)

Array days{7} 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)=5

Dim2(mult)=dim(mult,2)=10

Dim3(mult)=dim(mult,3)=100

?

Eg:

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;

總結:array其實是一個橫向操作語句,也就是說,當數(shù)據(jù)指針停留在某一條觀測時,可以通過array語句,把所有的array聲明的變量都操作一遍。

?

商業(yè)實戰(zhàn):

缺失值的填充;

data missing;

input x y$ z$ m;

cards;

. . . 1

2 . 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)計價格人數(shù)

data score;

input id$ x y z;

cards;

a 75 84 65

b 54 74 71

c 51 56 52

d 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)計所有成績都及格的學生記錄。

?

橫向排序變量

data a;

input x1-x7;

cards;

23 44 81 13 42 34 26

14 18 10 20 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;

利用冒泡算法實現(xiàn)橫向排序

?

縱向橫向綜合應用:刪除缺失值比例超過一定閾值的變量列表:

options symbolgen;

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 h

1 . 1 . 3 . . 6 . . k l

1 . . . . . . . a b c d

;

data _null_;

if 0 then

??set missing nobs=obs;

??array num_vars[*] _NUMERIC_;

??array char_vars[*] _CHARACTER_;

??call symputx('num_qty', dim(num_vars));

??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 [&char_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)||' '||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語句綜合應用的例子

第一個_null_程序,區(qū)分并計算所有數(shù)值型和字符型變量的個數(shù),并把結果賦值給兩個不同的宏變量;同時獲取數(shù)據(jù)集missing的觀測數(shù),也賦值給另外一個宏變量m_obs;整個程序都是在編譯階段完成的,沒有任何的執(zhí)行語句,這是為了提高效率,

第二步,對數(shù)值型和字符型分布計算每一個變量的缺失值個數(shù),并累加,最后根據(jù)預設的閾值,,找到滿足的所有變量,并賦值給宏變量mlist

第三步:data步,drop滿足條件的變量。

第二步說明“:

編譯過程聲明了四個數(shù)組,

num_vars指向所有的數(shù)值型變量(n1-n8,使用_numeric_故不再輸出數(shù)據(jù)集中顯示

char_vars指向所有的數(shù)值型變量(c1-c8,使用_character_故不再輸出數(shù)據(jù)集中顯示

數(shù)組num_miss,默認變量名是num_miss1-num_miss8,并設置初始值為0

數(shù)組char_miss,默認變量名是char_miss1-char_miss8,并設置初始值為0

接下來程序讀取數(shù)據(jù)集missing第一條觀測,執(zhí)行兩個do語句,

第一個do語句,獲得num_miss1=0,num_miss2=1,`````num_miss8=1

第二個do語句,獲得char_miss1=``````

接下來,判斷if finished語句,由于還沒有讀到文件末尾,所以程序不會執(zhí)行該語句,直接run語句,輸出第一條觀測,程序調回data開頭,繼續(xù)執(zhí)行下一個觀測,

依次下去,知道最后一條記錄。然后執(zhí)行if finshed語句,完成最后兩個do語句:

第三個do語句,執(zhí)行8次,如果缺失值超過70%,則執(zhí)行

list=trim(list)||' '||trim(vname(num_vars(i))),從而獲取全部的缺失值大于70%的數(shù)值型變量;

第四個do語句,同樣的道理

?

最后總結,array語句在處理橫向操作方面功能非常龐大,只要有array出現(xiàn)的地方,就要有do語句,

?

8.rename語句

Rename???old_name=new_name;

注意:rename語句是一個聲明語句,不是賦值語句

rename語句如果和keep語句同時出現(xiàn)的時候,系統(tǒng)先編譯keep語句,后編譯rename語句。drop類似于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编程与数据挖掘商业案例》学习笔记之十的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。