열에 배치된 목록의 조합나는 사물의 목록을 가져와서 가능한 모든 조합 쌍을 두 개의 열 집합에 표시하려고 합니다.현재 순열(열 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: 목록의 조합을 열에 넣습니다.성능에 관해서.
아래 코드는 6초가 채 안 되는 시간에 2000개 세트에서 거의 200만 개의 행 쌍 테이블을 생성합니다. 이는 루핑에 걸리는 시간의 절반에도 조금 못 미치는 시간입니다. 그러한 성능이 귀하의 목적에 적합한지 모르겠습니다. 이것이 귀하에게 실현 가능한 옵션이기를 바랍니다.
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개의 결과를 반환했습니다. 그런 다음 끝에 첫 번째 열 = 두 번째 열이면 삭제하는 간단한 선택 조건을 추가했습니다. JMP에서 어떤 방법이 더 빠른지 아시나요? 저는 대규모 데이터 세트로 작업하고 있으며 해당 매트릭스 방법도 시도해 볼 예정이지만 두 분 모두 무엇이 더 효율적인지 알고 계시는지 몰랐습니다.
Re: 목록의 조합을 열에 넣습니다.아마도 이를 수행하는 방법은 상당히 많을 것입니다(데카르트 조인). @txnelson 좋은 출발점입니다). 다음은 행렬 계산만 사용하는 옵션 중 하나입니다.
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;