這是我在 SAS 中的 if 陳述句的思維邏輯。它沒有運行,因為我被告知我使用不當。有人可以提供幫助嗎?
錯誤 180-322:陳述句無效或使用順序不正確。
data tmp_final_tab;
merge data.final_alerts_ramts(in=a) data.final_alerts_repamts(in=b) data.final_alerts_passthru(in=c)
data.final_alerts_wires(in=d) data.final_alerts_low_volume(in=e) data.final_alerts_bhvr(in=f);
by clnt_no;
if a;
if pamt_activity_cr >= &rnd_pct_atl then atl_inda1 = 1; else atl_inda1 = 0;
if pamt_activity_dr >= &rnd_pct_atl then atl_inda2 = 1; else atl_inda2 = 0;
if b;
if pamt_activity_cr >= &rnd_pct_atl then atl_indb1 = 1; else atl_indb1 = 0;
if pamt_activity_dr >= &rnd_pct_atl then atl_indb2 = 1; else atl_indb2 = 0;
if c;
if (ptam/total_Amount) * 100 >= &pt_pct_atl then atl_indc = 1; else atl_indc = 0;
if d;
if tot_amt_wire >= &hrc_wire_amt_atl then atl_indd = 1; else atl_indd1 = 0;
if tot_in_amt >= &wire_in_cnt_amt_atl then atl_indd2 = 1; else atl_indd2 = 0;
if tot_out_amt >= &wire_out_cnt_amt_atl then atl_indd3 = 1; else atl indd3 = 0;
if e;
if tot_amt_lv >= &lv_amt_atl then atl_ind = 1; else atl_ind = 0;
if f;
if tot_amt_bhvr >= &bhvr_w_hist_atl then atl_ind = 1; else atl_ind = 0;
if a or b or c or d or e or f
if (atl_inda atl_indb atl_indc atl_indd atl_inde atl_indf > 0) then btl_ind = 0; else btl_ind = 1;
run;
uj5u.com熱心網友回復:
ifSAS 中的陳述句始終具有以下形式(不帶<>):
if <boolean logic> then <code>;
如果被評估的邏輯需要做不止一件事,它遵循以下形式:
if <boolean logic> then do;
<code>;
<code>;
<code>;
...
end;
看起來您的所有代碼都創建了二進制變數。SAS 中的此編程快捷方式將為您生成二進制 1/0 變數:
binary_var = (<boolean logic>);
如果邏輯為真,binary_var則為 1,否則為 0。
您的代碼的正確形式如下,其中包含新二進制變數的更清晰形式。
data tmp_final_tab;
merge data.final_alerts_ramts (in=a)
data.final_alerts_repamts (in=b)
data.final_alerts_passthru (in=c)
data.final_alerts_wires (in=d)
data.final_alerts_low_volume(in=e)
data.final_alerts_bhvr (in=f)
;
by clnt_no;
if a then do;
atl_inda1 = (pamt_activity_cr >= &rnd_pct_atl);
atl_inda2 = (pamt_activity_dr >= &rnd_pct_atl);
end;
if b then do;
atl_indb1 = (pamt_activity_cr >= &rnd_pct_atl);
atl_indb2 = (pamt_activity_dr >= &rnd_pct_atl);
end;
if c then atl_indc = ( (ptam/total_Amount) * 100 >= &pt_pct_atl);
if d then do;
atl_indd = (tot_amt_wire >= &hrc_wire_amt_atl);
atl_indd2 = (tot_in_amt >= &wire_in_cnt_amt_atl);
atl_indd3 = (tot_out_amt >= &wire_out_cnt_amt_atl);
end;
atl_ind = ( (e AND tot_amt_lv >= &lv_amt_atl) OR (f AND tot_amt_bhvr >= &bhvr_w_hist_atl) );
btl_ind = (sum(atl_inda, atl_indb, atl_indc, atl_indd, atl_inde, atl_indf) > 0);
run;
從技術上講,您甚至不需要if此處的陳述句。您可以將資料集in邏輯合并到每個二進制變數中(例如binary_var = (a AND <logic>);。如果此操作不需要缺失值,您可以if完全洗掉這些陳述句。
uj5u.com熱心網友回復:
if a;是if陳述句的子集,并且在上述合并中非常常用 - 盡管可能不是您的意思。子集 if 意味著如果if條件不為真,資料步驟應該停止執行并轉到下一行。
在上述的情況下,if a;是true如果當前合并行包括從第一個資料集(其具有一些資料in=a在其資料集選項)。
像您一樣將它們灑在周圍是沒有意義的 - 這表明您的意思是if it comes from a then do these things,而不是if it doesn't come from a then drop it。
此外,對于所有六個 ( if a; if b; if c;...) 那么只有在所有六個輸入資料集中具有某些值的行才會被保留 - 一個inner join- 然后你的最后一部分沒有意義(帶有 的那個or)。但這樣做更有意義:
if a and b and c and d and e and f;
另一個注意事項:有select宣告,有時在這種組織中很有用。但是,只有當您只希望其中一個條件為真,或者只希望其中一個條件為真時才有用,而不管有多少條件為真——它會執行第一個為真的條件,然后離開。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/325825.html
