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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

八:modify語句((一個指針,兩個pdv)

merge語句和update語句對數據集橫向合并的主要功能還只能體現在匹配訪問上,如通過by語句,對每個by組中的匹配數據集進行修改或更新,對于非常龐大的數據集需要定期更新,并且每次更新的觀測對象是動態的時候,mergeupdate會消耗更多的資源,而是用modify可以通過高效的訪問機制來實現這個需求

四種語法:

1.匹配訪問

Data master_data;

??modify master_date??transaction_data;

??…;

??by variable;

Run;

注:除非使用output語句,否則data步后面只能接一個數據集,并且modify后面的第一個數據集必須和data步后面的數據集同名;

???by語句對應的是標識變量,不同于mergeupdate中的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的末尾。

?

當然也可以用sqlmerge執行實現:

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编程与数据挖掘商业案例》学习笔记之六的全部內容,希望文章能夠幫你解決所遇到的問題。

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