sas數據操作update、modify by ke=、控制modify的更新、datasets添加約束條件、操作文件變動aduit trail


update語句

UPDATE master-data-set<(data-set-options)> transaction-data-set<(data-set-options)>
<END=variable>
<UPDATEMODE= MISSINGCHECK | NOMISSINGCHECK>;
BY by-variable;

TIPS:

1:后面只能跟兩個數據集,且一定要和by語句連用,這個by語句給出了主數據集和更新數據集共同變量的名字。

2:update語句中使用的數據集必須實現按照by語句制定的變量進行排序,或者已經有合適的索引

3:對更新數據集存在缺失值的處理通過開關選項UPDATEMODE實現

MISSINGCHECK:檢查更新數據集,若有缺失值,則保留主數據及中相應的數據

NOMISSINGCHECK:不檢查更新數據集,若有缺失值,則將主數據集中的相應數據更新為缺失值

4:update能做到的merge都能做到,除了對更新數據及缺失值的處理

5:master數據集中的by組變量必須為unique,如果有重復只會對第一個進行更新,如果transaction中的數據有重復,則會用by group的最后一個隊master數據集中的進行更新。

 

 

modify語句

 

2.1:更改數據集中所有觀測行的值

DATA SAS-data-set;
  MODIFY SAS-data-set; /*數據集名字要一樣*/
  existing-variable = expression;
/*run前一步的默認操作不是output是replace*/ RUN;

比較modify與sql中update的效率

因為modify數據時不會進行數據的拷貝,所以這個地方可以有一定的加速

data test;
    set SASHELP.GEOEXP SASHELP.GEOEXP SASHELP.GEOEXP SASHELP.GEOEXP SASHELP.GEOEXP;
run;

/*在我機器上modify比update普遍快0.3秒,這里有三十幾萬行的數據*/
proc sql; update test set x=x+1000; quit; data test; modify test; x = x-1000; run;

 

 

2.2:利用transaction data更行master data

 更新by組中與master對應的觀測行的數據,運行時程序內部會自動生成一個dynamic where查詢語句

DATA SAS-data-set;
    MODIFY SAS-data-set transaction-data-set UPDATEMODE=MISSINGCHECK | NOMISSINGCHECK;
    BY key-variable;
RUN;

MISSINGCHECK  阻止缺失值更新主數據集
NOMISSINGCHECK  opposite way
 

對於帶重復值的情況sas怎么處理?

如果是master帶重復值,則只會更新重復值的第一條

如果是transaction帶重復值,則會用transaction by組中的最后一條更新master的數據

如果都帶重復值、、、那更新還有啥意思、、、、

對於transaction有缺失值的情況sas怎么處理?

不會用缺失值更新,除非該缺失值使用missing規定的特殊缺失值

 

 

2.3:利用索引更新數據集

和by一樣,缺失值不會自動覆蓋

data cargo99;
    set sasuser.newcgnum (rename =
        (capcargo = newCapCargo
        cargowgt = newCargoWgt
        cargorev = newCargoRev));

    modify cargo99 key=flghtdte;
        capcargo = newcapcargo;
        cargowgt = newcargowgt;
        cargorev = newcargorev;
run;    
/*car99是要更新的數據集,set是transaction數據集*/

如果是master帶重復值,則只會更新重復值的第一條

如果是transaction帶重復值且重復值不連續,則會用transaction by組中的最后一條更新master的數據

如果連續,則會進行按位置的11對應,然后在log中報錯。可以用unique選項來抑制錯誤(用unique后得到的結果和非連續的一樣!)

如果都帶重復值、、、那更新還有啥意思、、、、

 

 

3:控制modify 的 update process

3.1:modify的更新是根據你自己規定的條件來進行,並進行默認的replace

我們可以用 output replace remove 來對輸出進行控制

 

 

3.2:I/O錯誤監控

modify的by和key=形式都不輸入順序讀取,所以不能保證數據結合的正確性,這時很必要進行錯誤檢查

自動變量_iorc_是在modify的by和key=的形勢下才產生的

根據_iorc_的不同形式來進行不同的輸出操作

IF_IORC_=%SYSRC(mnemonic) THEN...

 

data master;
set transaction;
modify master key = id;
    if _IORC_=%sysrc(_sok) then
        do;
            a = b;
            replace;
        end;
    else
    if _IORC_=%sysrc(_dsenom) then
        do;
        output;
        _ERROR_ = 0;
    end;
run;            

 

4:約束條件

4.1:添加約束條件

在建表的同時建立約束條件必須使用proc sql

使用proc datasets在已存在的數據集上建立約束條件

對於unique和primary key選項,sas會自動建立索引

當拷貝數據集時,大部分的操作都會拷貝相應的限制條件

proc datasets nolist;
modify capinfo;
    ic create PKIDInfo=primary key(routeid)
        message='You must supply a Route ID Number';
    ic create Class1=check(where=(cap1st<capbusiness or capbusiness=.))
        message='Cap1st must be less than CapBusiness';
quit;

 

4.2:查看約束條件

proc contents data=xxx;

 

proc datasets lib=libref;

contents data=;

quit;

 

4.3:刪除約束條件

proc datasets;
    modify capinfo;
        ic delete pkidinfo;
        ic delete class1;
quit;

 

5:追蹤觀測值的變動

when you may want to track the changes that you make by using an audit trail(添加,刪除,或者更改等等)

An audit trail is an optional SAS file that logs modifications to a SAS table

5.1:創建audit

 

proc datasets nolist;
    audit capinfo;
    initiate;
quit;

5.2:讀取aduit文件

To refer to the audit trail file, use the TYPE= data set option.

proc contents data=mylib.sales (type=audit);
run;
proc print data=capinfo (type=audit);
run;

 

5.3:操作aduit trail文件

該類文件包含三類變量

􀁸 data set variables that store copies of the columns in the audited SAS data set
􀁸 audit trail variables that automatically store information about data modifications
􀁸 user variables that store user-entered information.

5.3.1:自動變量以AT開頭

 特別解釋下_ATOPCODE_,他包含的值如下

 

When you initiate an audit trail, options in the LOG statement determine the type of entries stored in the audit trail

proc datasets nolist;
audit capinfo;
    initiate;
    log data_image=NO before_image=NO;
quit;

 

5.3.2:用戶變量

User variables are unique in SAS in that they are stored in one file (the audit file) and opened for update in another file (the data set)

proc datasets nolist;
audit capinfo;
initiate;
    user_var     who $20 label = 'Who made the change'
                why $20 label = 'Why the change was made';
quit;

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM