Kombinationen einer Liste in Spalten unterteiltIch versuche, eine Liste von Dingen zu erstellen und alle möglichen Kombinationspaare in zwei Spalten erscheinen zu lassen.Ich habe derzeit ein Skript erstellt, das Permutationen ausführt (plus Wiederholungen desselben Werts in Spalte a vs. Spalte b), aber ich habe Schwierigkeiten, es auf Kombinationen zu reduzieren. Wenn die Liste der Dinge zum Beispiel 1, 2, 3, 4, 5 wäre, dann brauche ich nicht sowohl 1/2 als auch 2/1 oder 1/1. Unten ist mein Skript, das ich derzeit habe, und ich denke, ich bin nah dran, ich brauche nur noch ein bisschen mehr, um dorthin zu gelangen, wo ich sein muss. Ich muss dieses Skript nur dazu bringen, zwei Kombinationen einer beliebigen Liste auszuwählen. In diesem speziellen Beispiel werden der Einfachheit halber fünf Dinge verwendet.Danke
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];
)
);
Qualitäts- und VerfahrenstechnikBetreff: Kombinationen einer Liste in Spalten unterteiltIch sollte auch erwähnen, dass die Beispiele, die ich verwendet habe, mit Strings waren. Wenn Sie Zahlen verwenden, können Sie einfach direkte Matrixoperationen verwenden, die ziemlich schnell sind ... die 2-Millionen-Zeilen-Tabelle wird in 0,3 Sekunden generiert und die 26choose5-Tabelle in 0,04 Sekunden.
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." ) );

Betreff: Kombinationen einer Liste in Spalten unterteiltWas die Leistung angeht.
Der folgende Code generiert die fast 2 Millionen Zeilenpaartabelle aus einem Satz von 2000 in etwas weniger als 6 Sekunden, was etwas weniger als halb so lange ist wie die Schleife. Ich weiß nicht, ob eine solche Leistung für Ihre Zwecke geeignet ist. Hoffentlich ist es eine praktikable Option für Sie.
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>

Betreff: Kombinationen einer Liste in Spalten unterteiltHallo,
Die NHooseK Matrix( )-Funktion ist maßgeschneidert für Probleme wie dieses. Es ist auch einigermaßen schnell und besonders nützlich für k>2. Schauen Sie sich den folgenden Code an, um ein Beispiel für zwei und fünf Dinge zu sehen, die aus einer Menge von 26 ausgewählt wurden.
Prost,
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>Betreff: Kombinationen einer Liste in Spalten unterteiltOhne große Änderungen könnten Sie die anfängliche Liste einfach als Zahlen verwenden und dann eine Konvertierungstabelle erstellen, um Zeichenwerte basierend auf diesen numerischen Werten zu verbinden.
Betreff: Kombinationen einer Liste in Spalten unterteiltHallo @jthi , irgendwelche Ideen, wenn die anfängliche Liste eine Zeichenfolge statt einer Zahl ist? Da die Matrix nur für den Datentyp „Zahl“ funktioniert.
Betreff: Kombinationen einer Liste in Spalten unterteiltIch weiß nicht, welche Methode am schnellsten funktionieren würde.Mein Vorschlag ist, beide davon laufen zu lassen und zu sehen, welches am schnellsten ist.
Betreff: Kombinationen einer Liste in Spalten unterteiltDanke. Ich habe mir was angeschaut @txnelson schlug den kartesischen Join vor und implementierte ihn auch, und er lieferte 15 statt 10 Ergebnisse. Ich habe dann am Ende einfach eine einfache Auswahlbedingung hinzugefügt, bei der ich sie auch gelöscht habe, wenn die erste Spalte = die zweite Spalte ist. Weiß einer von euch, welche Methode in JMP schneller ist? Ich arbeite mit einem großen Datensatz und werde auch diese Matrixmethode ausprobieren, weiß aber nicht, ob einer von Ihnen weiß, was effizienter sein sollte.
Betreff: Kombinationen einer Liste in Spalten unterteiltHöchstwahrscheinlich gibt es dafür ziemlich viele Möglichkeiten (die kartesische Verknüpfung). @txnelson ist ein guter Ausgangspunkt). Hier ist eine Option, die nur Matrixberechnungen verwendet:
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)),
);

Betreff: Kombinationen einer Liste in Spalten unterteiltIch habe ein paar Codezeilen hinzugefügt, die die doppelten Kombinationen beseitigen.Darüber hinaus würde ich vorschlagen, dass Sie sich damit befassen
Tabellen=>Verbinden
bei der kartesischen Verknüpfungsfähigkeit.

Es erzeugt alle möglichen Kombinationen viel schneller als JSL-Code.
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;