Verehrte Gäste,
Ich habe Probleme beim Erstellen einer neuen Spalte, die eine Formel ist, und beim Senden einer Variablen an diese in meinem JSL-Skript.
Ich habe eine Datumstabelle, in der ich versuche, die durchschnittliche Verzögerung einer Spalte zu berechnen. Die interessierende Spalte ist nicht unbedingt immer gleichmäßig in Zeilen angeordnet, die Verzögerungen können sich manchmal ändern. Für die Zwecke meines Skripts ist es jedoch in Ordnung, sich einfach die durchschnittliche Verzögerung für die gesamte Spalte anzusehen.
Ich wollte dies tun (und kann es manuell tun, würde es aber lieber mit einem Skript automatisieren), indem ich eine Lag-Spalte von :X erstellte und dann die Differenz von :X-:Lag(X) nahm und dann die Col. Mittelwert davon. In Bezug auf die Formel (mathematisch) sollte es so aussehen:
ave_lag = Col Mean(:X-:Lag(X))
Das Problem, das ich habe, besteht darin, die neue Spalte mit der Lag-Formel darin zu erstellen. Jedes Mal, wenn ich versuche, das Skript auszuwerten, wird der wörtliche Text dessen, was ich schreibe, in die Formel eingefügt und nicht der beabsichtigte Spaltenname. Ich habe den Befehl dt<
Ich habe auch Eval(Substitute(Expr())) ausprobiert, aber es fügt buchstäblich die in Anführungszeichen gesetzte Zeichenfolge ein, nicht die Spalte als Referenz, wie zum Beispiel :X.
In der Tabelle, mit der ich arbeite, habe ich beispielsweise diesen Code ausprobiert:
Eval(
Substitute(
Expr(
dt << New Column( "temp", Formula( Lag( __tcols__ ) ) )
),
Expr( __tcols__ ), xcols[1]
)
);Dadurch entsteht eine Spalte „temp“, die Formel lautet jedoch wie folgt:

Der Name der Spalte ist t und die Variable xcols={"t"}. Die Formel sollte wie Lag(:t) aussehen, ein Verweis auf die Spalte, nicht auf den Spaltennamen.
Ich habe sogar diesen anderen Code ausprobiert, um die Spaltennummer von :t zu extrahieren (sie kann sich innerhalb der Datentabelle ändern) und dann die Spalte (#) in die Formel einzufügen, aber auch das funktioniert nicht.
collist = dt << Get Column Names( string ); //creates a list of the column names
colnum = Loc( collist, xcols[1] )[1]; //locates the position in the list of the script variable xcols[1].
//This previous part basically gets the column number of the local variable xcol in the data table (it can change).
//This is the script where I'd like it to substitute
Eval(
Substitute(
Expr(
dt << New Column( "temp", Formula( Lag( Column( __tcols__ ) ) ) )
),
Expr( __tcols__ ), colnum
)
);Dadurch entsteht auch eine Spalte „temp“, die Formel lautet jedoch wie folgt:

Ich dachte, das sollte einfacher sein, als ich es herausfinde, aber ich muss etwas falsch/seltsam machen, weil ich nicht die Ergebnisse erhalte, die ich erwarten würde.
Für Vorschläge zur Berechnung der durchschnittlichen Verzögerung einer Spalte sind wir sehr dankbar. Ich brauche nur eine einzelne Zahl, letztendlich brauche ich keine zusätzlichen Spalten.
Danke!,
DS
Versuchen:
Eval( Eval Expr(
dt << New Column( "TEMP", "Numeric", <<SET each="" value=""></SET>
Sie müssen JSL mitteilen, dass es sich bei der Zeichenfolge tatsächlich um einen Namen handelt (damit sie wie eine Variable betrachtet wird). Als Name() Funktion
Hallo @ErraticAttack ,
Vielen Dank für Ihre Eingabe, und obwohl der Name der Spalte ordnungsgemäß in die Spaltenformel eingefügt wurde, verursachte dieser bestimmte Codeabschnitt in meinem anderen vorhandenen Code letztendlich Probleme mit Verweisen auf einige Anzeigefelder, die aktualisiert werden mussten auf Benutzereingaben. Leider verursachte dieser Weg zu viele Probleme, weshalb ich am Ende den Code änderte und nur mit den Werten aus der Spalte von Interesse arbeitete: Zuerst erstellte ich eine Matrix und berechnete dann einfach die Zeile (n+1). -row(n) Differenz der Spalte und Mittelung der Matrix.
n = Matrix( N Rows( dt ), 1 );
For( i = 1, i <= N Items( n ) - 1, i++,
n[i] = (dt:xcols[i + 1] - dt:xcols[i]) / timefactor
);
deltat = Round( Mean( n ), 3 );
Dabei ist „Zeitfaktor“ eine Variable, die davon abhängt, ob die Spalte in den Einheiten Tage, Minuten, Stunden usw. vorliegt oder nicht.
Vielen Dank für Ihre Lösung des ursprünglichen Problems, wie man eine Variable an eine neue Spaltenfunktion sendet. Leider musste ich einen anderen Weg gehen, um die Funktionalität des Codes als Ganzes zu lösen.
Danke!,
DS