Combinaisons d'une liste mise en colonnesJ'essaie de prendre une liste de choses et de faire apparaître toutes les paires de combinaisons possibles dans un ensemble de deux colonnes.J'ai actuellement généré un script qui effectue des permutations (plus des répétitions de la même valeur dans la col a par rapport à la col b) mais j'ai du mal à savoir comment le réduire à des combinaisons. Par exemple, si la liste de choses était 1, 2, 3, 4, 5, alors je n'ai pas besoin à la fois de 1/2 et de 2/1, ou de 1/1. Vous trouverez ci-dessous mon script que j'ai actuellement et je pense que j'en suis proche, j'ai juste besoin d'un peu plus pour arriver là où je dois être. J'ai juste besoin de faire en sorte que ce script choisisse strictement 2 combinaisons d'une liste arbitraire. Cet exemple particulier utilise 5 éléments pour plus de simplicité.merci
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];
)
);
Ingénierie Qualité et ProcédésRe : Combinaisons d'une liste mise en colonnesJe dois également mentionner que les exemples que j'ai utilisés concernaient des chaînes. Si vous utilisez des nombres, vous pouvez simplement utiliser des opérations matricielles directes, qui sont assez rapides... la table de 2 millions de lignes est générée en 0,3 seconde et la table 26choose5 en 0,04 seconde.
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 : Combinaisons d'une liste mise en colonnesQuant aux performances.
Le code ci-dessous génère la table de près de 2 millions de lignes de paires à partir d'un ensemble de 2 000 en un peu moins de 6 secondes, soit un peu moins de la moitié de la durée du bouclage. Je ne sais pas si une telle performance convient à vos besoins. J'espère que c'est une option réalisable pour vous.
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 : Combinaisons d'une liste mise en colonnesBonjour,
La fonction NChooseK Matrix( ) est conçue sur mesure pour des problèmes comme celui-ci. C'est également raisonnablement rapide et particulièrement utile pour k>2. Consultez le code ci-dessous pour un exemple de 2 éléments et de 5 éléments choisis parmi un ensemble de 26.
Acclamations,
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>Re : Combinaisons d'une liste mise en colonnesSans trop de changements, vous pouvez simplement utiliser la liste initiale sous forme de nombres, puis créer une table de conversion pour joindre les valeurs de caractères en fonction de ces valeurs numériques.
Re : Combinaisons d'une liste mise en colonnesSalut @jthi , des idées si la liste initiale est une chaîne au lieu d'un nombre ? Puisque la matrice ne fonctionne que pour le type de données numérique.
Re : Combinaisons d'une liste mise en colonnesJe ne sais pas quelle méthode fonctionnerait le plus rapidement.Ma suggestion est de les exécuter tous les deux et de voir lequel est le plus rapide.
Re : Combinaisons d'une liste mise en colonnesMerci. J'ai regardé quoi @txnelson a suggéré et également implémenté la jointure cartésienne et a renvoyé 15 résultats au lieu de 10. J'ai ensuite simplement ajouté une simple condition de sélection à la fin où si la première colonne = la deuxième colonne, je les ai également supprimées. L'un de vous sait-il quelle méthode est la plus rapide dans JMP ? je travaille avec un grand ensemble de données et j'essaierai également cette méthode matricielle, mais je ne savais tout simplement pas si l'un de vous savait ce qui devrait être plus efficace.
Re : Combinaisons d'une liste mise en colonnesIl existe très probablement de nombreuses façons de procéder (la jointure cartésienne @txnelson est un bon point de départ). Voici une option utilisant uniquement des calculs matriciels :
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 : Combinaisons d'une liste mise en colonnesJ'ai ajouté quelques lignes de code qui élimineront les combinaisons en double.De plus, je vous suggère de vous pencher sur
Tables=>Rejoindre
à la capacité de jointure cartésienne.

Il produit toutes les combinaisons possibles beaucoup plus rapidement que le code JSL ne peut le faire.
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;