<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />你好,
我嘗試使用“對於每一行”和“開始資料更新”腳本命令來更新與列相關的特定行的計算。
根據下表,我打算有兩個附加列,即缺陷率 (%) 和產量,它們都使用相同的細胞數量/每日總數等式。
但是,缺陷率 (%) 欄位將只計算類別 = Reject & MRB 的行,良率列將只計算類別 = Binned 的行。
我可以使用 IF 命令來解決這個問題,例如
dt=當前資料表();
dt<< 新欄位("缺陷率(%)", 數字, "連續", 公式(Name Expr(If(:Category == "Reject", "MRB" ,:Cell 數量/:每日總計))) ) ;
但是,我嘗試學習如何將 For every row 與 Begin Data Update 結合使用來達到相同的結果。
dt<< 新欄位("產量", 數字, "連續");
<< 開始資料更新;
對於每行(:Yield_ = Selected(行狀態())=包含(:類別,「分箱」),:儲存格數量/:每日總計)
有人可以幫忙嗎?
謝謝,
類別 | 工作週 | 日期_產品。 | 電池數量 | 每日總計 | 不良率(%) | 屈服 |
| 拒絕 | 25 | 2016-06-20 | 第751章 | 15553 | | |
| MRB | 25 | 2016-06-20 | 21 | 15553 | 0.00135022 | |
| 裝箱 | 25 | 2016-06-20 | 14781 | 15553 | 0.95036327 | 0.95036327 |
| 拒絕 | 25 | 2016-06-21 | 第1251章 | 31586 | | |
| MRB | 25 | 2016-06-21 | 83 | 31586 | 0.00262775 | |
| 裝箱 | 25 | 2016-06-21 | 30252 | 31586 | 0.9577661 | 0.9577661 |
| 拒絕 | 25 | 2016-06-22 | 1276 | 27964 | | |
| MRB | 25 | 2016-06-22 | 42 | 27964 | 0.00150193 | |
| 裝箱 | 25 | 2016-06-22 | 26646 | 27964 | 0.95286797 | 0.95286797 |
| 拒絕 | 25 | 2016-06-23 | 126 | 1786 | | |
| MRB | 25 | 2016-06-23 | 5 | 1786 | 0.00279955 | |
| 裝箱 | 25 | 2016-06-23 | 1655 | 1786 | 0.92665174 | 0.92665174 |
嗨,伯尼426,
根據我個人的經驗,IF命令非常快速地完成其操作,並且會立即返回結果,因為它們只處理是或否的情況。 另一方面,在透過循環完全產生結果之前,您會看到一些明顯的延遲,因為循環命令必須處理迭代,並且它們將繼續運行,直到到達程式設計師定義的最後一次迭代。
這些語句僅適用於涉及大量行和列的超大型資料集,這使得 IF 命令在時間消耗方面比循環命令更優越。 然而,對於較小的資料集,使用任一命令都是安全的,因為填充結果的時間延遲可以忽略不計。
此致,
瓦爾
嗨瓦爾,
感謝您建議的解決方案,它們都運作良好。
實際上,我想出了另一種使用 IF 命令的公式方法,例如
dt=當前資料表();
dt<< 新欄位("缺陷率(%)", 數字, "連續", 公式(Name Expr(If((contains(:Category, "MRB")| contains(:Category, "Reject")),:電池數量/:每日總數))));
dt<< New Column("產量", Numeric, "連續", Formula(Name Expr(If(:Category == "Binned",:單元格數量/:每日總計))));
您知道使用 IF 指令和循環指令的黑白速度差異是多少嗎?
非常感謝,
你好,
根據您問題中的預期輸出,我認為您的公式中存在輕微錯誤“不良率(%) ”列,如果您只想忽略“類別”列中的“拒絕”行。
我從未嘗試過使用 For every row 或之前開始進行資料更新,所以我不確定如何使用這些命令修復當前的程式碼。 然而我有兩種替代方法來實現相同的輸出。
1)使用IF指令(更快的方法):
dt=當前資料表();
a = (dt<< 新欄位("DR", "連續", 公式(If(:類別== "拒絕", "", Char(:儲存格數量/ :每日總計)))))<<獲取值;
dt << New Column("不良率(%)", "連續", 設定值(a));
b = (dt<< 新欄位("Y", "連續", 公式(If(:Category == "Binned", Char(:儲存格數/ :每日總計), ""))))<<獲取值;
dt << 新欄位("產量", "連續", 設定值(b));
dt<<刪除欄位({"DR","Y"});
由於某些列應作為空列 ("") 傳回,因此建立的列將自動將其自身設為字元列,即使您在建立列時已將它們定義為數字。 因此,我創建了額外的虛擬列來滿足計算目的,並將這些值設為新列中(“不良率(%) ”和“產量”)您打算創建的。 這樣,您將獲得數字列。
2) 使用 Get rows where() 和 FOR 迴圈:
dt=當前資料表();
dt << New Column("缺陷率(%)", "連續", numeric);
r1 = dt << 取得行 where(:Category!="Reject");
對於 (i=1, i<=nrows(r1), i++,
Column(dt,“不良率(%)”)[r1 ] = :電池數[r1 ] / :每日總計[r1 ]
);
dt << 新欄位("產量", "連續", 數字);
r2 = dt << 取得行 where(:Category=="Binned");
對於 (i=1, i<=nrows(r2), i++,
列(dt,“產量”)[r2 ] = :電池數[r2 ] / :每日總計[r2 ]
);
我相信如果您的資料集很大,這種方法會更慢,因為循環需要更長的處理時間。
最終輸出:

希望這可以幫助!
此致,
瓦爾