Vorschlag zur Makeover-Challenge: Etwas über Schleifen oder das Finden von Elementen/Werten in einer Liste/Matrix/...Betreff: Vorschlag zur Makeover-Challenge: Etwas über Schleifen oder das Finden von Elementen/Werten in einer Liste/Matrix/...Hallo @jthi ,
Ich habe Ihren ersten Vorschlag ausprobiert – und er funktioniert wie beabsichtigt. Vielen Dank. Die letzte Zeile ist so ziemlich der Einzeiler, den ich gesucht habe!
Betreff: Vorschlag zur Makeover-Challenge: Etwas über Schleifen oder das Finden von Elementen/Werten in einer Liste/Matrix/...Ähnliche Idee wie Georg. Jedes Mal, wenn Sie neue Spalten auswählen, führen Sie den EvalEvalExpr()-Teil erneut aus (kann bei Bedarf in ein Skript/Add-In/eine Verknüpfung umgewandelt werden).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
//create placeholder for colum
new_col = dt << New Column("Sum_selected", Numeric, Continuous);
//after column selection run this part to update script
Eval(EValExpr(new_col << Set Formula(Sum(Expr(Current Data Table() << Get Selected Columns)))));JMP verfügt (meines Wissens) nicht über einen „Column State Handler“, sodass Sie keine Ereignisse auslösen können, nachdem sich die Spaltenauswahl geändert hat, wie dies bei Zeilen der Fall ist.
Sie können so etwas auch versuchen, aber ich würde Ihnen davon abraten und die Formelaktualisierung auf Tastendruck statt auf die Änderung der Filter-Spaltenfeld-Auswahl verschieben, da es auf diese Weise einfacher zu handhaben ist
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
nw = New Window("Update formula",
window:new_col = dt << New Column("Sum_selected", Numeric, Continuous); //create column inside new window
window:dt = dt;
flc = Filter Col Selector(
dt, << character(0), << nominal(0), << ordinal(0),
<< On Change(
show(window:new_col, window:dt);
window:dt << Select columns((flc << Get Selected));
Eval(EValExpr(window:new_col<< Set Formula(Sum(Expr(window:dt << Get Selected Columns)))));
)
)
);Betreff: Vorschlag zur Makeover-Challenge: Etwas über Schleifen oder das Finden von Elementen/Werten in einer Liste/Matrix/...Liebling @Monomorphist ,
vielleicht hilft das. Wenn ich mit vielen Spalten arbeite, finde ich es vorteilhaft, mit Spaltengruppen zu arbeiten. Das folgende Beispiel definiert eine Gruppe (viele Beispiele finden Sie im Skriptindex), erstellt eine Mittelwertformel für diese Spalten und implementiert sie.
Dasselbe ist bei Bedarf für möglicherweise ausgewählte Spalten skriptfähig.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Blood Pressure.jmp" );
Wait( 1 );
theGroup = dt << Group Columns( "theGroup", :BP 8M :: :BP 12W );
Wait( 1 );
// build an expression for formula with column replacement
formula_expr = expr(dt << New Column( "Mean_of_Group",
Numeric,
"Continuous",
Format( "Best", 10 ),
Formula( mean( expr(current data table() <<GET column="" group=""></GET>
Betreff: Vorschlag zur Makeover-Challenge: Etwas über Schleifen oder das Finden von Elementen/Werten in einer Liste/Matrix/...Hallo DS,
Nun, so habe ich es bisher gemacht: Durchlaufen der Zeilen und dann für jede Zeile das Durchlaufen der Spalten. Ich hatte jedoch auf eine elegantere Lösung gehofft. Ein einfacher Einzeiler....
Hier ist ein konkretes und sehr einfaches Beispiel:
Ich habe 50 Spalten und möchte für jede Zeile das arithmetische Mittel der Spalten berechnen, die ich auswählen möchte. Nehmen wir an, ich wähle die drei Spalten E1, E6 und E12 aus, um den Mittelwert zu berechnen. Wenn ich das manuell mache, brauche ich ein paar Sekunden: Füge eine Spalte in der Datentabelle hinzu, wähle die 3 Spalten aus und dividiere durch 3 -> (:E1 + :E6 + :E12) / 3.
Wenn ich das in einem Skript machen möchte und das Skript für den Fall gültig halten möchte, dass ich nicht 3, sondern 4 oder 5 oder 20 Spalten wähle, habe ich keine andere Möglichkeit gefunden – weder hier in der Community noch in B. die JMP-Bibliothek/Skripthandbücher usw. – als eine vertikale Schleife durch jede Zeile und dann eine horizontale Schleife durch die Spalten zu verschachteln. Das scheint sehr umständlich zu sein? Die andere Möglichkeit wäre, 49 verschiedene Makros zu schreiben, jedes für die genaue Anzahl der ausgewählten Spalten, d. h. wenn ich 7 Spalten auswählen möchte, führe ich script7 aus, und wenn ich 21 Spalten auswählen möchte, führe ich script21 mit der Formel aus angepasst auf 21 Artikel. Das finde ich ziemlich lächerlich (dann behalte ich besser meine klobigen verschachtelten Schleifen ...)
Gibt es keine JSL-Syntax, die eine Formel zu einem einfachen Einzeiler wie dem folgenden zusammenfasst:
dt << Neue Spalte („AnyTitle“, numerisch, kontinuierlich, Formel ( Sum_of_all_selected_columns / N_items) )?
Wie würde die Ausdrucks-/Spaltenformel „Sum_of_all_selected_columns“ in JSL aussehen (falls vorhanden?!?), wenn die ausgewählten Spalten aus einer ColDialog ColList abrufbar sind? Ist es möglicherweise das ::-Bit -> Sum(v1::vn) ,wobei v1 das erste Element in der ColList und vn das letzte ist und die Formel das erste, das letzte und alles dazwischen aufsummiert, ohne dass angegeben werden muss, wie viele Elemente dazwischen liegen?
Ich stoße ziemlich häufig auf dieses Problem, wenn ich möchte, dass das Skript etwas (z. B. Summe oder Produkte usw.) mit einer a priori unbekannten Anzahl von Elementen berechnet.
Prost,
Kofi
Betreff: Vorschlag zur Makeover-Challenge: Etwas über Schleifen oder das Finden von Elementen/Werten in einer Liste/Matrix/...Hallo @Monomorphist ,
Hier ist ein modifizierter Code, den ich beim Durchsuchen der Diskussionsforen gefunden habe. Der ursprüngliche Beitrag ist Hier .
Ich denke, wenn Sie eine Liste Ihrer Ergebnisspalten haben, die ziemlich einfach zu generieren oder abzurufen sein sollte, dann sollten Sie in der Lage sein, so etwas wie meine modifizierten AddCols zu implementieren, um die Formeln zu generieren, die Sie benötigen. Der ursprüngliche Beitrag war sehr informativ und interessant.
Names Default To Here( 1 );
// Make a table
nc = 30;
dt = New Table( "Test" );
For( c = 1, c <= nc, c++,
dt << New Column( "Col" || Char( c ), Numeric, Continuous, Formula( Random Normal() ) )
);
dt << AddRows( 100 );
// Select half the columns
n = Round( nc / 2 );
c = Random Index( N Col( dt ), n );
For( i = 1, i <= n, i++,
Column( dt, c[i] ) << setSelected( 1 )
);
//This part generates the column formulas based on the SelCols list.
SelCols = dt << Get Selected Columns;
For( j = N Items(SelCols), j >= 1, j--,
AddCols = Expr(
dt << New Column( "Sum_" || Char( j ), Formula( Sum( colsTBD ) ) )
);
Substitute Into( AddCols, Expr( colsTBD ), Eval( selCols[1::j] ) );
AddCols;
);
Hoffe das hilft!,
DS
Betreff: Vorschlag zur Makeover-Challenge: Etwas über Schleifen oder das Finden von Elementen/Werten in einer Liste/Matrix/...80 % meiner Skripterstellung besteht aus Schleifen, die Datensätze durchlaufen, die üblicherweise mehr als 100.000 Zeilen und mehr als 50 Spalten umfassen. Abhängig von den von mir festgelegten Bedingungen extrahiert das Skript möglicherweise 2, 3 oder 5 oder 10 oder 20 dieser Spalten für eine Vielzahl von Berechnungen (z. B. Log-Verhältnis-Paare), deren Ergebnisse dann im zusätzlichen „result " Spalten, vielleicht 10, 20 oder 100 davon (die ich dann auf Ähnlichkeiten vergleichen muss ...). Wenn ich jetzt mit den Ergebnisspalten arbeiten möchte, aber nicht weiß, mit wie vielen davon ich letztendlich enden werde ... wie schreibe ich meine Formeln so, dass sie immer gültig sind, egal ob für 2 oder für 200? Spalten angewendet werden?
Ich kann jede Ergebnisspalte in einer Liste ablegen, sodass ich weiß, wie viele Ergebnisspalten ich habe. Aber ich weiß immer noch nicht, wie ich die Gleichung formulieren soll (z. B. x = n1 + n2 für 2 Spalten, aber n1 + n2 + .... + nn für n Spalten).
Prost,
Kofi