重複する値をどのように判別しますか?こんにちは、みんな、
このコードがありますが、これに対してより適切なアプローチがあるかどうかはよくわかりません。一部のデータ テーブルに複数の NBO 値があるため、ループでエラーが発生します。
'For Each' のアクセスまたは評価で行 10 のデータが範囲外です。For Each/*###*/({table}, dt_Test, table << New Column( "Ref" ); Wait( 0 ); table
:Ref[table << get rows where( :Lot == "NBO" & :N Rows == Col Max( :N Rows, :Lot ) )]
= 1)
そこで私がやろうとしているのは、For Each ループ内に If ステートメントを作成することです。IF ステートメントは、NBO が Lot 列に重複していないかどうかを判断し、重複していない場合は Ref 列に 1 を配置します。
For Each( {table}, dt_Test,
table << New Column("Ref");
wait(0);
If (
//NBO has duplicate, deletes the NBO with lowest N Row value
dt_Test << Select duplicate rows(Match(:Lot)); //only selects the matching values, how can I delete the NBO with lowest N Rows count?
dt_Test << Delete Rows;
,
//if NBO has no duplicates,
table:Ref[table << get rows where( :Lot == "NBO" & :N Rows == col max(:N Rows, :Lot))]=1;
);
);
自動化とスクリプトウィンドウズRe: 重複する値を特定し、N 行の値が最も小さいデータを削除するにはどうすればよいでしょうか?一部のデータを見ることができれば、作業がずっと簡単になります。
Re: 重複する値を特定し、N 行の値が最も小さいデータを削除するにはどうすればよいでしょうか?以下はサブセット後のサンプル データ テーブルです。dt には 2 つの NBO があり、正常に動作します。
table:Ref[table << get rows where( :Lot == "NBO" & :N Rows == col max(:N Rows, :Lot))]=1;
しかし、NBO が 1 つある dt2 では、スクリプトが突然停止し、次のエラーが発生します。
'For Each' のアクセスまたは評価で行 10 のデータが範囲外です。For Each/*###*/({table}, dt_Test, table << New Column( "Ref" ); Wait( 0 ); table
:Ref[table << get rows where( :Lot == "NBO" & :N Rows == Col Max( :N Rows, :Lot ) )]
= 1)
Re: 重複する値を特定し、N 行の値が最も小さいデータを削除するにはどうすればよいでしょうか?あなたのスクリプトとあなたがしようとしていることに少し混乱しています。重複したロットを見つけて、最後の行以外をすべて削除しようとしているのですか? その後、NBO を 1 に設定します (残るのは 1 つだけになるはずです)?
Re: 重複する値を特定し、N 行の値が最も小さいデータを削除するにはどうすればよいでしょうか?申し訳ありませんが、私も質問を書くときに混乱してしまいました。そのため、データについては、まずサブセット化してから、各データ テーブルを調べて、NBO が N 行の中で最大のカウントを持つ列 Ref とその値を 1 として追加します。最初はこれを機能させました:
For Each( {table}, dt_Test,
table << New Column("Ref");
wait(0);
table:Ref[table << get rows where( :Lot == "NBO" & :N Rows == col max(:N Rows, :Lot))]=1;
);しかし、列に NBO が 1 つだけ存在するデータ テーブルにループすると、次のエラーが発生します。
'For Each' のアクセスまたは評価で行 10 のデータが範囲外です。For Each/*###*/({table}, dt_Test, table << New Column( "Ref" ); Wait( 0 ); table
:Ref[table << get rows where( :Lot == "NBO" & :N Rows == Col Max( :N Rows, :Lot ) )]
= 1)
Re: 重複する値を特定し、N 行の値が最も小さいデータを削除するにはどうすればよいでしょうか?問題は別のところにあるのかもしれません。たとえば、dt_test には何が含まれていますか? また、dt_test と table は少し奇妙な方法で使用されています (また、if はここであなたが考えているように動作していない可能性があります)

デバッグしやすいようにコードを少し変更します([] 内に get 行を配置しないでください)
Names Default To Here(1);
dt = Open("$DOWNLOADS/dt.jmp");
dt2 = Open("$DOWNLOADS/dt2.jmp");
dts = Eval List({dt, dt2});
For Each({cur_dt}, dts,
cur_dt << New Column("Ref");
//cur_dt = dts[2];
sel_rows = cur_dt << get rows where(:Lot == "NBO" & :N Rows == Col Max(:N Rows, :Lot));
cur_dt:Ref[sel_rows] = 1;
);
この方法でsel_rowsを印刷して、空かどうか、何が含まれているかを確認できます。
Re: 重複する値をどのように判別しますか?まったく異なるアプローチを提案するかもしれません。
1. テーブルを日付順、または最新の重複を示す方法で並べ替えます。
2. テーブルをそれ自体に結合し(テーブル>結合)、複数のテーブルをドロップするオプションをクリックします。
- 重複のうち、行順で最初のものだけが製品テーブルに格納されます。
ワークフロー ビルダーをオンにしてこれを手動で 1 回実行すると、スクリプトが完成して、もう一度実行できるようになります。スクリプト... スクリプトなしで。
Re: 重複する値をどのように判別しますか?いいトリックだ:)