列に入れるリストの組み合わせ物事のリストを取得し、考えられるすべての組み合わせを 2 つの列のセットに表示しようとしています。現在、順列(さらに、列 a と列 b で同じ値の繰り返し)を実行するスクリプトが生成されていますが、それを組み合わせに減らす方法に苦労しています。 たとえば、もののリストが 1、2、3、4、5 の場合、1/2 と 2/1、または 1/1 の両方は必要ありません。以下は私が現在持っているスクリプトです。ほぼ目標に近づいていると思いますが、必要なところに到達するにはもう少し必要です。 このスクリプトでは、任意のリストから 2 つの組み合わせを選択することを厳密に実行する必要があります。 この特定の例では、簡単にするために 5 つのものを使用しています。ありがとう
Names Default To Here( 1 );
New Table( "Test",
Add Rows( 5 ),
New Column( "API 10", Numeric, "Continuous", Format( "Best", 15 ), Set Values( [4238939261, 4238939263, 4238939262, 4238939328, 4238939329] ) ),
);
Test = Data Table( "Test" );
APIs = Test:API 10 << get values;
working = New Table( "TestAPIComb", New Column( "API10" ), New Column( "API102" ), add rows( N Items( APIs ) ^ 2 ) );
APIs2 = Test:API 10 << get values;
theRow = 0;
For( APICNT = 1, APICNT <= N Items( APIs ), APICNT++,
For( API2CNT = 1, API2CNT <= N Items( APIs2 ), API2CNT++,
theRow++;
:API10[theRow] = APIs[APICNT];
:API102[theRow] = APIs[API2CNT];
)
);
品質およびプロセスエンジニアリングRe: 列に入れるリストの組み合わせまた、私が使用した例は文字列を使用したものであることにも言及しておきます。 数値を使用している場合は、ストレート行列演算を使用するだけで済みます。これは非常に高速です。200 万行のテーブルは 0.3 秒で生成され、26choose5 テーブルは 0.04 秒で生成されます。
Names Default To Here(1);
nums = J(2e3, 1, randominteger(1e9));
t1 = hptime();
astable(shape(nums[nChoosekMatrix( 2e3, 2 )], ., 2));
t2 = hptime();
Print( Eval Insert( "Create table of 2 numbers chosen from 2000: ^(t2-t1)/1e6^ seconds." ) );
// 26 choose 5
nums = J(26, 1, randominteger(1e9));
t3 = hptime();
astable(shape(nums[nChoosekMatrix( 26, 5 )], ., 5));
t4 = hptime();
Print( Eval Insert( "Create table of 5 numbers chosen from 26: ^(t4-t3)/1e6^ seconds." ) );

Re: 列に入れるリストの組み合わせパフォーマンスに関しては。
以下のコードは、2000 のペアのセットから約 200 万行のペアのテーブルを 6 秒弱で生成します。これは、ループにかかる時間の半分よりわずかに短いです。 そのようなパフォーマンスがあなたの目的に適しているかどうかはわかりません。 それがあなたにとって実現可能な選択肢であることを願っています。
Names Default To Here( 1 );
letters = Words( "abcdefghijklmnopqrstuvwxyz", "" );
// create a large list of random strings of length 10. use an AA to remove (unlikely) duplicates
lis = Associative Array( Repeat( {Concat Items( letters[J( 10, 1, Random Integer( 26 ) )], "" )}, 2e3 ) ) << get keys;
t1 = HP Time();
// looping solution
dt = new table( "xx", add rows (2e6), << new column ("X", character), <<NEW column=""></NEW>

Re: 列に入れるリストの組み合わせこんにちは、
NChooseK Matrix( ) 関数は、このような問題に合わせて作成されています。 また、かなり高速であり、特に k>2 の場合に役立ちます。 26 個のセットから 2 個と 5 個を選択した例については、以下のコードを確認してください。
乾杯、
ブレイディ
names default to here(1);
lis = words("abcdefghijklmnopqrstuvwxyz","");
// original example: choose 2
dt = astable( nchoosekMatrix(nitems(lis), 2), << column names({"x", "y"}) );
dt << new column ("first", character, << set values ( lis[dt:x << get values]));
dt << new column ("second", character, << set values ( lis[dt:y << get values]));
dt << delete columns (1::2);
// a more interesting example: choose 5
dt = astable( nchoosekMatrix(nitems(lis), 5), << column names( words("x1,x2,x3,x4,x5",",") ) );
for each ({ i }, 1::5, //i = 1;
eval (substitute( expr(dt << new column ( "y"||char(i), character, <<SET values=""></SET>Re: 列に入れるリストの組み合わせ大きな変更を加えずに、初期リストを数値として使用し、それらの数値に基づいて文字値を結合する変換テーブルを作成することができます。
Re: 列に入れるリストの組み合わせこんにちは@jthi 、初期リストが数値ではなく文字列である場合のアイデアはありますか? 行列は数値データ型でのみ機能するため、
Re: 列に入れるリストの組み合わせどの方法が最も早く機能するかわかりません。私の提案は、両方を実行してどちらが速いかを確認することです。
Re: 列に入れるリストの組み合わせありがとう。 私は何を見ました@txnelsonデカルト結合を提案および実装したところ、10 ではなく 15 の結果が返されました。 次に、最初の列 = 2 番目の列の場合は、それらも削除する単純な選択条件を最後に追加しました。 どちらかが、JMP でどの方法が速いか知っていますか?私は大規模なデータセットを扱っているので、その行列法も試してみますが、どちらがより効率的であるかを知っているかどうかわかりませんでした。
Re: 列に入れるリストの組み合わせおそらく、これを行うには非常に多くの方法があります (デカルト結合@txnelson良い出発点です)。 ここでは行列計算のみを使用する 1 つのオプションを示します。
Names Default To Here(1);
// input list
m = [4238939261, 4238939263, 4238939262, 4238939328, 4238939329];
n_items = N Items(m);
// combination count
comb_count = Summation(i = 1, n_items - 1, i++);
m = Sort Ascending(m);
first_col = [];
second_col = [];
For(i = 2, i <= n_items, i++,
first_col ||= Repeat(m[i - 1], n_items - i + 1)`;
second_col ||= m[Index(i, n_items)]`;
);
dt = New Table("Combinations",
Add Rows(comb_count),
New Column("FirstCol", Numeric, Continuous, Values(first_col)),
New Column("SecondCol", Numeric, Continuous, Values(second_col)),
);

Re: 列に入れるリストの組み合わせ重複する組み合わせを排除するコードを数行追加しました。さらに、以下についても調べてみることをお勧めします。
テーブル=>結合
デカルト結合機能で。

JSL コードよりもはるかに高速に、可能なすべての組み合わせを生成します。
Names Default To Here( 1 );
New Table( "Test",
Add Rows( 5 ),
New Column( "API 10", Numeric, "Continuous", Format( "Best", 15 ), Set Values( [4238939261, 4238939263, 4238939262, 4238939328, 4238939329] ) ),
);
Test = Data Table( "Test" );
APIs = Test:API 10 << get values;
working = New Table( "TestAPIComb", New Column( "API10" ), New Column( "API102" ), add rows( N Items( APIs ) ^ 2 ) );
APIs2 = Test:API 10 << get values;
theRow = 0;
For( APICNT = 1, APICNT <= N Items( APIs ), APICNT++,
For( API2CNT = 1, API2CNT <= N Items( APIs2 ), API2CNT++,
theRow++;
:API10[theRow] = APIs[APICNT];
:API102[theRow] = APIs[API2CNT];
)
);
dt = Data Table( "TestAPIcomb" );
// Arange data so order is the same for all rows
For( i = 1, i <= N Rows( dt ), i++,
If( :API102[i] > :API10[i],
hold = :API10[i];
:API10[i] = :API102[i];
:API102[i] = hold;
)
);
// Find the duplicates
dt << Select Duplicate Rows( :API10, :API102 );
// Delete the duplicates
dt << delete rows;