指定した行の列を更新<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />こんにちは、
「各行ごと」および「データ更新の開始」スクリプト コマンドを使用して、列に関連する特定の行の計算を更新しようとしています。
以下の表によると、不良率 (%) と歩留まりという 2 つの追加列を設ける予定で、どちらもセル数量/日合計という同じ式を使用します。
ただし、不良率 (%) 列は、Category = Reject & MRB の行のみを計算し、Yield 列は、Category=Binned の行のみを計算します。
次のようなIFコマンドを使用してこの結果を得ることができます
dt=現在のデータテーブル();
dt<< New Column("不良率(%)", Numeric, "Continuous", Formula(Name Expr(If(:Category == "Reject", "MRB" ,:Cell Qty/:Daily Total)))) ;
ただし、同じ結果を得るために、For each row と Begin Data Update を組み合わせて使用する方法を学ぼうとしています。
dt<< New Column("Yield", Numeric, "Continuous");
<< データ更新を開始します。
各行( :Yield_ = Selected(Row State())=Contains(:Category,"Binned"), :Cell Qty/:Daily Total)
誰か手伝ってくれませんか?
ありがとう、
カテゴリー | 勤務週間 | 日付_PROD。 | セルの数量 | 毎日の合計 | 不良率(%) | 収率 |
| 拒否する | 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 |
Re: 指定した行の列を更新するこんにちは、bernie426 さん
私の個人的な経験によると、IF コマンドは「はい」または「いいえ」の状況のみを処理するため、操作を非常に迅速に完了し、即座に結果を返します。 一方、ループ コマンドは反復を処理する必要があり、プログラマが定義した最後の反復に到達するまで動作し続けるため、ループを通じて結果が完全に生成されるまでにかなりの遅延が発生します。
これらのステートメントは、大量の行と列を含む超巨大なデータ セットを扱う場合にのみ適用されます。そのため、時間の消費という点では、ループ コマンドよりも IF コマンドの方が優れたオプションになります。 ただし、データセットが小さい場合は、結果が設定されるまでの時間遅延がわずかであるため、どちらのコマンドを使用しても安全です。
よろしくお願いします、
ヴァル
Re: 指定した行の列を更新するこんにちは、ヴァルさん
提案された解決策をありがとう、どちらもうまくいきます。
実際、私は次のような IF コマンドを使用した別の数式アプローチを思いつきました。
dt=現在のデータテーブル();
dt<< New Column("不良率(%)", Numeric, "Continuous", Formula(Name Expr(If((contains(:Category, "MRB")| contains(:Category, "Reject")),:セル数量/:日次合計))));
dt<< New Column("収量", Numeric, "Continuous", Formula(Name Expr(If(:Category == "Binned",:Cell Qty/:Daily Total)));
IFコマンドとループコマンドを使用した場合、b/wの速度の違いはどれくらいかご存知ですか?
どうもありがとう、
Re: 指定した行の列を更新するこんにちは、
あなたの質問で予想される出力に基づいて、「」の式にわずかな間違いがあると思います不良率(%) 「Category」列の「Rejected」行のみを無視したい場合は、「」列を使用します。
For each row を使用したことはありません。データ更新を開始する前に、これらのコマンドを使用して現在のコードを修正する方法がわかりません。 しかし同じ出力を達成する方法について、2 つの代替アプローチがあります。
1) IF コマンドを使用する (より高速な方法):
dt=現在のデータテーブル();
a = (dt<< New Column("DR", "Continuous", Formula(If(:Category == "Reject", "", Char(:Cell Qty / :Daily Total))))<<値を取得;
dt << New Column("不良率(%)", "連続", 設定値(a));
b = (dt<< New Column("Y", "Continuous", Formula(If(:Category == "Binned", Char(:Cell Qty / :Daily Total), ""))))<<値を取得;
dt << New Column("収量", "Continuous", 値を設定(b));
dt<<列を削除({"DR","Y"});
一部の列は空の列 ("") として返されることを意図しているため、列の作成時に数値として定義していても、作成された列は自動的に文字列に設定されます。 したがって、計算目的で追加のダミー列を作成し、これらの値を新しい列に設定しました ("不良率(%) " および " Yield") を作成しようとしています。 このようにして、数値列を取得します。
2) Get rows where() および FOR ループの使用:
dt=現在のデータテーブル();
dt << New Column("不良率(%)", "連続", 数値);
r1 = dt << 行を取得 where(:Category!="拒否");
for (i=1, i<=nrows(r1), i++,
列(dt, "不良率(%)")[r1 ] = :セル数[r1 ] / :毎日の合計[r1 】
);
dt << 新しい列("収量", "連続", 数値);
r2 = dt << 行を取得 where(:Category=="Binned");
for (i=1, i<=nrows(r2), i++,
列(dt, "収量")[r2 ] = :セル数[r2 ] / :毎日の合計[r2 ]
);
データセットが巨大な場合、ループには処理時間がかかるため、このアプローチは遅くなると思います。
最終出力:

お役に立てれば!
よろしくお願いします、
ヴァル