Combinazioni di un elenco inserite in colonneSto cercando di prendere un elenco di cose e di far apparire tutte le possibili coppie di combinazioni in un insieme di due colonne.Al momento ho generato uno script che esegue permutazioni (più ripetizioni dello stesso valore in col a vs col b) ma sto lottando su come ridurlo a combinazioni. Ad esempio, se l'elenco delle cose fosse 1, 2, 3, 4, 5, non ho bisogno sia di 1/2 che di 2/1 o 1/1. Di seguito è riportato lo script che ho attualmente e penso di essere vicino, mi serve solo un po' di più per arrivare dove devo essere. Devo solo fare in modo che questo script esegua rigorosamente la scelta di 2 combinazioni di un elenco arbitrario. Questo esempio particolare utilizza 5 cose per semplicità.Grazie
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];
)
);
Ingegneria della qualità e dei processiRi: Combinazioni di un elenco inserito in colonneDovrei anche menzionare che gli esempi che ho usato riguardavano le stringhe. Se stai usando i numeri, puoi semplicemente usare le operazioni a matrice diretta, che sono piuttosto veloci... la tabella da 2 milioni di righe viene generata in 0,3 secondi e la tabella 26choose5 in 0,04 secondi.
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." ) );

Ri: Combinazioni di un elenco inserito in colonnePer quanto riguarda le prestazioni.
Il codice seguente genera una tabella di coppie di quasi 2 milioni di righe da un set di 2000 in poco meno di 6 secondi, ovvero poco meno della metà del tempo impiegato dal loop. Non so se tale prestazione sia adatta ai tuoi scopi. Spero che sia un'opzione fattibile per te.
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>

Ri: Combinazioni di un elenco inserito in colonneCiao,
La funzione NChooseK Matrix() è fatta su misura per problemi come questo. È anche ragionevolmente veloce e particolarmente utile per k>2. Controlla il codice qui sotto per un esempio di 2 cose e 5 cose, scelte da un set di 26.
Saluti,
Brady
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>Ri: Combinazioni di un elenco inserito in colonneSenza molte modifiche potresti semplicemente utilizzare l'elenco iniziale come numeri e quindi creare una tabella di conversione per unire i valori dei caratteri in base a tali valori numerici.
Ri: Combinazioni di un elenco inserito in colonneCIAO @jthi , qualche idea se l'elenco iniziale è una stringa anziché un numero? Poiché la matrice funziona solo per il tipo di dati numerico.
Ri: Combinazioni di un elenco inserito in colonneNon so quale metodo funzionerebbe più velocemente.Il mio suggerimento è di eseguirli entrambi e vedere quale è il più veloce.
Ri: Combinazioni di un elenco inserito in colonneGrazie. Ho guardato cosa @txnelson ha suggerito e implementato anche l'unione cartesiana e ha restituito 15 risultati invece di 10. Quindi ho semplicemente aggiunto una semplice condizione di selezione alla fine in cui se la prima colonna = la seconda colonna, le ho anche cancellate. Qualcuno di voi sa quale metodo è più veloce in JMP? Sto lavorando con un set di dati di grandi dimensioni e proverò anche quel metodo a matrice, ma non sapevo se nessuno di voi sa cosa dovrebbe essere più efficiente.
Ri: Combinazioni di un elenco inserito in colonneMolto probabilmente ci sono molti modi per farlo (il join cartesiano @txnelson è un buon punto di partenza). Ecco un'opzione che utilizza solo i calcoli della matrice:
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)),
);

Ri: Combinazioni di un elenco inserito in colonneHo aggiunto alcune righe di codice che elimineranno le combinazioni duplicate.Inoltre, ti suggerirei di esaminare
Tabelle=>Unisci
alla capacità di unione cartesiana.

Produce tutte le combinazioni possibili molto più velocemente di quanto possa fare il codice 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;