Ich benötige eine JSL-Schleife, die die Spaltenüberschriften einer Datentabelle durchsucht. Wenn die Spaltenüberschrift „(rad)“ enthält, möchte ich alle Werte in dieser Spalte mit 180/Pi multiplizieren und dann „(rad)“ in der Spaltenüberschrift in „(deg)“ ändern.
Ich habe alles versucht, was mir eingefallen ist – einschließlich chatGPT – aber bisher ohne Erfolg.
- Alle Spalten abrufen mit << Spaltennamen abrufen
- Legen Sie fest, dass die Tabelle nicht mit << begin data update (Datenaktualisierung beginnen) aktualisiert wird.
- Führen Sie eine Schleife mit „For Each“ durch sie.
- Überprüfen Sie, ob der Name (rad) enthält, indem Sie Enthält / Beginnt mit / Endet mit verwenden.
- Verwenden Sie „For Each Row“, um eine Schleife darüber zu erstellen und die Werte in Grad umzuwandeln
- Ich würde hoffen, dass es dafür eine bessere Methode gibt, aber ich bin mir nicht sicher, ob es wirklich eine gibt, es sei denn, Sie möchten neue Spalten erstellen und alte löschen, da wir nicht << verwenden sollten, um jeden Wert festzulegen, was die Ausführung und das Lesen extrem einfach macht
- Formel an Ort und Stelle anwenden (hinzugefügt in JMP18) könnte funktionieren, aber es ist schwer zu verstehen, wie man sie benutzt
- Die Verwendung von Matrixwerten ist eine gute Option, aber „For Each Row“ funktioniert immer. Es ist immer eine gute Idee, es zu lernen.
- Verwenden Sie „substitute“ und „<< Set Name“, um die Spalte umzubenennen
- Lassen Sie die Tabelle mit << erneut aktualisieren. Enddatenaktualisierung
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(2),
Compress File When Saved(1),
New Column("Column 1", Numeric, "Continuous", Format("Best", 12), Set Values([., .])),
New Column("a (rad)", Numeric, "Continuous", Format("Best", 12), Set Values([1, .]))
);
colnames = dt << Get Column Names(Continuos, "String");
dt << Begin Data Update();
For Each({colname}, colnames,
If(Contains(colname, "(rad)"),
For Each Row(dt, Column(dt, colname)[] = Column(dt, colname)[] * 180 / Pi());
Column(dt, colname) << Set Name(Substitute(colname, "(rad)", "(deg)"));
)
);
dt << End Data Update();
Write();
Immer wieder beeindruckend, vielen Dank!
Ein paar Anschlussfragen:
- Warum steht „colname“ als erstes Argument der For-Each-Schleife in geschweiften Klammern?
- Ich habe versucht, etwas wie „dt:colname[rowIdx] = dt:colname[rowIdx] * 180/Pi()“ zu machen – wie würde JMP diese Zeile interpretieren und warum ist sie falsch?
- Was macht das "[]" am Ende von "Column(dt,colname)[]"? Gibt es einen Abschnitt in der Dokumentation, der diese Konstruktion bespricht?
Nochmals vielen Dank!