こんにちは、JMP コミュニティです。
ロット番号 (略してロット) という共通の列を共有する 2 つの異なるデータ テーブルがあります。 (W10 で JMP Pro 14.1.0 を実行)
データ テーブルは 2 つの異なるソースからのものであり、行数が異なります。 データ テーブルの 1 つを使用して、他のデータ テーブル内の一致する行を選択したいと考えています。 Lot の値は連続/数値です。 dt1 には 1430 行があり、dt2 には 158 行があります。 dt1 には dt2 よりも多くのロットがあるため、dt2 を使用して dt1 内の一致するロットのみを選択する必要があります。
dt1<
2 つの for ループを使用して実行できると思います。dt1 の各行について、dt2 をループしてどこが等しいかを確認します。残念ながら、これにより 225940 件の比較が発生し、簡単だと思っていましたが、JMP にはるかに時間がかかります。想像していたよりも。
これは私が書いた選択コードです:
For(l=1, l<=NRows(dt1), l++,
For(i=1, 1<=NRows(dt2), i++,
dt1<<SELECT where=""></SELECT>しかし、うまくいきません。 無限ループに陥っているようです(JMPを強制終了する必要がありました)。
この投稿を書いているときに少し読んだのですが、以前に選択した行をすべて保持する必要があるため、Current Selection("extend") オプションを呼び出す必要があります。 したがって、上記のコードが機能しないことは間違いなくわかっていますが、何かが行われるはずです。
これを行うには、For ループよりも速く、よりエレガントなものが必要です。
フィードバックをお待ちしております。
ありがとう!、
DS
これを行うには 2 つの方法があります。最初の方法ではあなたのアプローチを使用しますが、大規模なデータテーブルでは時間がかかります。
Names Default To Here( 1 );
// create sample data
dtMain = New Table( "Main",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "a", "b", "c"} )
)
);
dtSmall = New Table( "Small",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "e"} ),
Set Display Width( 49 )
)
);
Names Default To Here( 1 );
dtMain << clear select;
For( i = 1, i <= N Rows( dtSmall ), i++,
dtMain << select where(
dtMain:Lot == dtSmall:Lot[i],
current selection( "extend" )
)
);
2番目の方が効率的に機能します
Names Default To Here( 1 );
// create sample data
dtMain = New Table( "Main",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "a", "b", "c"} )
)
);
dtSmall = New Table( "Small",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "e"} ),
Set Display Width( 49 )
)
);
// Create a new column as a Select indicator
dtSmall << New Column( "Select", set each value( 1 ) );
// Update the Main table with values from the Small table
dtMain << Update( With( dtSmall ), Match Columns( :lot = :lot ) );
// Select the matching columns
dtMain << select where( :select == 1 );
// get rid of select columns
dtMain << delete columns( "Select" );
dtSmall << delete columns( "Select" );