《SAS编程与数据挖掘商业案例》学习笔记之六
八:modify語句((一個指針,兩個pdv))
merge語句和update語句對數據集橫向合并的主要功能還只能體現在匹配訪問上,如通過by語句,對每個by組中的匹配數據集進行修改或更新,對于非常龐大的數據集需要定期更新,并且每次更新的觀測對象是動態的時候,merge和update會消耗更多的資源,而是用modify可以通過高效的訪問機制來實現這個需求。
四種語法:
1.匹配訪問
Data master_data;
??modify master_date??transaction_data;
??…;
??by variable;
Run;
注:除非使用output語句,否則data步后面只能接一個數據集,并且modify后面的第一個數據集必須和data步后面的數據集同名;
???by語句對應的是標識變量,不同于merge和update中的by語句對應的變量需要排序
???主數據集對應by變量的消除重復值后的集合應該包含更新數據集對應的by變量消除重復值猴島集合;
???主數據集有重復時只更新第一條,更新數據集中有重復值時,最后一條起更新作用。
?2.索引訪問
Data master_data;
??set transaction_data;
???modify master_data??key=variable;
??…..;
Run;
注:
更新數據集在主數據集沒有找到主數據集key=對應的變量值,系統會設置自動變量_error_值為1,并在日志報錯中顯示該變量,
?
索引訪問和匹配訪問的不同點:
匹配訪問中更新數據集同名變量會自動覆蓋主數據集;索引訪問會被當做不同的變量;
對于更新數據集出現by重復值的處理,索引訪問會報錯并終止程序,不過可以通過unique來糾正。
3.觀測序號訪問
Data master_data;
??set transaction_data;
??modify master_data??point=variable;
??…;
Run;
如果更新數據集在主數據集中沒有找到point=對應的變拉直,系統會自動設置自動變量_error_的值為1,另外point=有可能陷入死循環,需要配合stop使用。
?
4.順序訪問
Data master_data;
?????modify master_data;
??????…;
Run;
?
注:關于自動變量_iorc_,當運行modify語句時,_iorc_變量自動生成,包含系統每次運行modify語句時返回的I/O操作碼,以匹配訪問為例,如果主數據集by變量值在更新數據集中存在,自動變量_iorc_返回0,如果主數據集by變量值在更新數據集中不存在,不產生自動變量_iorc_,但是如果更新數據集by變量值在主數據集中不存在,自動變量_iorc_會返回一個非0值。
?
Eg:
修改觀測值:
Data??a1;
???modify??a1;
???if??x=2??then y=200;
Run;
?
程序解讀:首先編譯,創建一個pdv,此時數據集a1處于打開狀態,但是由于modify的獨特機制,系統并沒有另外開辟外存空間,所以整個程序運行過程中,在磁盤設備上看不到數據集a1的臨時數據集。
由于modify語句采用動態where語句,而where查詢動作是在pdv之前完成,因此當系統讀到if x=2的時候,數據指針在pdv之前就指向該觀測值并修改,最后由pdv輸出,且輸出的方式不是output而是replace方式,除非用戶指定output。系統會默認采用replace方式輸出。當用output的時候,喜歡很可能會陷入死循環。
?
商業應用:定期更改客戶交易總額
主數據集:
Data master_trans;
???input??user_id??trans_amt @@;
??cards;
??101??1000??102 1500 103 2000
;
Run;
交易數據集:
Data day_trans;
Input user_id??day_amt @@;
Cards;
102??50??102??60??103??30??110??80
;
Run;
?
程序實現:
data master_trans;
modify master_trans day_trans;
by user_id;
trans_amt=trans_amt day_amt;
if _iorc_=0 then replace;
else do;trans_amt=day_amt;_error_=0;output; end;
run;
?
程序解讀:
第一步:編譯階段,系統產生兩條pdv,一條為master_trans所有,另一條為day_trans所有;
第二步:Master_trans的數據指針直接指向master_trans的第二條觀測,同時day_trans的指針指向day_trans的第一條觀測,執行累加語句trans_amt=trans_amt day_amt;執行完后,發現還有day_trans中還有一條觀測與master_trans中的第二條觀測匹配,于是,day_trans的數據指針指向day_trans的第三條觀測,再次執行累加語句,知道day_trans中沒有與之匹配的數據,系統會繼續執行以下語句,接下來if _iorc_=0 then replace;被執行,因為該匹配是成功匹配,所以系統返回自動變量_iorc_=0,然后執行replace語句,
重復執行第二步,系統同樣以replace方式輸出master_trans的第三條觀測,
此時master_trans的數據指針指向master_trans末尾,但是day_trans還有最后一條觀測沒有在master_trans中被發現,于是系統返回一個非零的自動變量_iroc_,此時將執行else后面的語句,最后執行output的輸出方式到master_trans的末尾。
?
當然也可以用sql和merge執行實現:
proc sql;
create table temp as
select
user_id
,sum(day_amt) as day_amt
from day_trans
group by 1;
quit;
proc sort data=master_trans;by user_id;run;
proc sort data=temp;by user_id;run;
data master_trans;
merge master_trans temp;
by user_id;
if trans_amt eq . then trans_amt=COALESCE(trans_amt,day_amt);
else trans_amt=sum(trans_amt,day_amt);
run;
?
總結:modify常用于根據某些需求條件更新特定變量組,或者對主數據集的某些變量做歷史累加。
總結
以上是生活随笔為你收集整理的《SAS编程与数据挖掘商业案例》学习笔记之六的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《SAS编程与数据挖掘商业案例》学习笔记
- 下一篇: 《SAS编程与数据挖掘商业案例》学习笔记