JSL: Formel mit einem variablen Spaltennamen erstellenHallo,
Ich möchte etwas wirklich Einfaches tun (zumindest dachte ich das), nämlich eine neue Spalte mithilfe von JSL mit einer Formel zu erstellen, die einen variablen Spaltennamen enthält. Ich habe bereits mehrere Kombinationen der Befehle „column, as columns, name, as name, eval, parse..“ ausprobiert und das Forum durchsucht, aber alles, was ich versucht habe, ergab einen Fehler, dass die Formel nicht ausgewertet werden konnte.
Ein Beispiel, was ich tun möchte:
„Spalte 1“ ist eine Spalte in meiner Datentabelle.
a = "column 1";
new column("test", formula(a*2));
Die Spalte „Test“ sollte die Formel enthalten, die „Spalte 1“ mit 2 multipliziert.
Vielen Dank für jede Hilfe,
Dahla
Betreff: JSL: Formel mit einem variablen Spaltennamen erstellenNachdem ich versucht hatte, eine funktionierende Lösung zu finden, gab ich schließlich auf und fragte den JMP-Support, wie das gemacht werden könnte. Wendy zeigte mir freundlicherweise die wichtigsten Zeilen und ich bettete sie als Demo in eine for-Schleife ein. Der Code, den ich einfüge, geht davon aus, dass die aktuelle Datentabelle zwei Spalten mit den Namen abc und def enthält, die einige Datenzeilen Ihrer Wahl enthalten. Übrigens gibt es ein neues SAS Press-Buch mit dem Titel „Jump into JMP Scripting“ von Wendy Murphrey und Rosemary Lucas, ein sehr hilfreiches Buch zum Thema Scripting. Es deckt jedoch die im Beispiel verwendeten Werte „Expr“ und „Eval Expr“ ab.
dt = Current Data Table();
cols = {abc, def};
nlist = N Items(cols);
For( i = 1, i <= nlist, i++,
newColExpr = Expr(
dt << New Column( char(cols[i])||"*2", Numeric, Formula( Expr( cols[i] ) * 2 ) )
);
Eval( Eval Expr( newColExpr ) );
)Betreff: JSL: Erstellen einer Formel mit einem variablen SpaltennamenManchmal können die einfachsten Dinge in JSL überwältigend sein 
Hier sind einige Ansätze:
new column("test",formula( as column("column 1")*2 ));
oder
a = "column 1";
new column("test",formula( a[]*2 ));
Die Logik der Syntax ist ungefähr wie folgt. Im ersten Beispiel behandeln wir „Spalte 1“ als Zahlenspalte. Im zweiten Beispiel zeigt „[]“ an, dass a ein Zahlenarray ist.
Hoffe das hilft
Betreff: JSL: Erstellen einer Formel mit einem variablen SpaltennamenDanke für die Antwort, aber leider hilft sie nicht weiter.
Der erste Ansatz ist nicht das, was ich wollte, da ich den Spaltennamen aus einer Variable entfernen muss (er kann sich ändern).
Der zweite Ansatz funktioniert nicht, da JMP den tatsächlichen Spaltennamen nicht in die Formel einfügt. Im Dialog zum Ändern der Formel steht in deinem Vorschlag „a[Empty()] * 2“, und ich brauche dort etwas wie „:Column1 * 2“.
Irgendwelche anderen Vorschläge?Betreff: JSL: Erstellen einer Formel mit einem variablen SpaltennamenIch denke, mein zweites Beispiel hätte so lauten sollen:
a = Column("column 1");
new column("test",formula( a[]*2 ));
Betreff: JSL: Erstellen einer Formel mit einem variablen Spaltennamen@mpb: Das funktioniert prima! Danke fürs Herausfinden und den Buchtipp!Betreff: JSL: Erstellen einer Formel mit einem variablen SpaltennamenDanke, das funktioniert!Betreff: JSL: Erstellen einer Formel mit einem variablen SpaltennamenEine Zusatzfrage hätte ich noch:
Was ich letztendlich erreichen möchte, ist, für jedes Element einer Liste eine neue Spalte zu erstellen. In Stigs Lösung hängt die Spaltenformel weiterhin von der Variable "a[]" ab und nicht (wie ich es bevorzugen würde) vom Spaltennamen "Spalte 1". Daher kann ich "a[]" im folgenden Skript nicht ändern, ohne die berechneten Spaltenwerte ebenfalls zu ändern. Das bedeutet, dass mein folgender Ansatz nicht funktioniert (die Länge der Kolliste und die Spaltennamen können sich ändern, daher benötige ich eine Schleife):
collist = {"column 1", "column 2"};
for (k=1, k<=length(collist), k++,
a = Column(collist);
new column(concat("test",char(k)), formula( a[]*2 ));
);
Auch das direkte Einfügen eines Listenelements in die formula()-Anweisung funktioniert nicht. Hat jemand einen anderen Vorschlag?
Dahla
Betreff: JSL: Erstellen einer Formel mit einem variablen SpaltennamenWenn ich den folgenden Code verwende:
dt = Current Data Table();
a = Column("height");
dt << New Column("test1",formula(a[]*2));
a = Column("weight");
dt << New Column("test2",formula(a[]*2));
Beide Spalten test1 und test2 werden korrekt berechnet, obwohl die Formeln für beide auf dieselbe Variable a verweisen. Prinzipiell sollte es also keine Probleme mit dem Code innerhalb einer Schleife geben. Dieser Ansatz funktioniert jedoch nicht, wenn die neuen Spalten ihr Verhalten in der Tabelle als berechnete Spalten beibehalten sollen – was die Frage offen lässt, wie man aus Code eine Spalte mit der Formel ":Spalte 1 * 2" generiert ...
Betreff: JSL: Erstellen einer Formel mit einem variablen SpaltennamenOh, ich sehe erst jetzt, dass mein vorheriger Beitrag nicht vollständig angezeigt wurde ... Entschuldigung dafür.
Ja, ich möchte, dass die Spalten ihr Verhalten oder zumindest die Werte beibehalten. Deshalb hatte ich die Idee, die Formeln direkt nach der Berechnung zu entfernen. Ich hatte jedoch das Problem, dass ich keine Anweisung gefunden habe, die dasselbe bewirkt wie "Formel... -> Löschen", d. h. die Formel entfernt und die Werte unverändert behält. Weiß jemand, wie das funktioniert?
Das wäre zwar nicht die schönste Lösung, reicht mir aber im Moment.Betreff: JSL: Erstellen einer Formel mit einem variablen SpaltennamenIch habe nun den Workaround gemacht, die Werte aus der Spalte in einen Vektor auszulesen und die berechneten Werte in eine neue Spalte zu schreiben.
Ich bin aber weiterhin an Antworten auf die offenen Fragen interessiert.
Dahla