Chers tous,
J'ai du mal à essayer de créer une nouvelle colonne qui est une formule et à lui envoyer une variable dans mon script JSL.
J'ai une table de dates dans laquelle j'essaie de calculer le décalage moyen d'une colonne. La colonne d'intérêt n'est pas nécessairement toujours espacée de manière égale par des lignes, les décalages peuvent parfois changer. Cependant, pour les besoins de mon script, il est acceptable de simplement regarder le décalage moyen pour toute la colonne.
La façon dont j'allais faire cela (et je peux le faire manuellement, mais je préfère l'automatiser avec un script) est de créer une colonne Lag de :X puis de prendre la différence de :X-:Lag(X), puis de prendre le Col C'est méchant. En termes de formule (mathématiques), cela devrait ressembler à :
ave_lag = Col Mean(:X-:Lag(X))
Le problème que j'ai est de créer la nouvelle colonne contenant la formule Lag. Chaque fois que j'essaie d'évaluer le script, il place le texte littéral de ce que j'écris dans la formule et non le nom de colonne prévu. J'ai essayé la commande dt<
J'ai également essayé Eval(Substitute(Expr())), mais il met littéralement la chaîne citée, pas la colonne comme référence, comme :X.
Par exemple, dans le tableau avec lequel je travaille, j'ai essayé ce code :
Eval(
Substitute(
Expr(
dt << New Column( "temp", Formula( Lag( __tcols__ ) ) )
),
Expr( __tcols__ ), xcols[1]
)
);Ce qui produit une colonne "temp", mais la formule est la suivante :

Le nom de la colonne est t et la variable xcols={"t"}. La formule doit ressembler à Lag(:t), une référence à la colonne, pas au nom de la colonne.
J'ai même essayé cet autre code pour extraire le numéro de colonne de :t (il peut changer dans la table de données), puis insérer la colonne (#) dans la formule, mais cela ne fonctionne pas non plus.
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
)
);Ce qui produit également une colonne "temp", mais la formule est la suivante :

Je pensais que cela devrait être plus facile que je ne le découvre, mais je dois faire quelque chose de mal/d'étrange parce que je n'obtiens pas les résultats auxquels je m'attendais.
Toute suggestion sur la façon de calculer le décalage moyen d'une colonne est très appréciée. Je n’ai besoin que d’un seul numéro, en fin de compte, je n’ai pas besoin de colonnes supplémentaires.
Merci!,
DS
Essayer:
Eval( Eval Expr(
dt << New Column( "TEMP", "Numeric", <<SET each="" value=""></SET>
Vous devez dire à JSL que la chaîne est en fait un nom (pour qu'il la considère comme une variable), donc le Comme nom() fonction
Salut @ErraticAttack ,
Merci pour votre contribution, et bien qu'il ait réussi à insérer correctement le nom de la colonne dans la formule de colonne, ce morceau de code particulier dans mon autre code existant a fini par causer des problèmes avec les références à certaines zones d'affichage qui doivent être mises à jour en fonction sur la saisie de l'utilisateur. Malheureusement, cela a posé trop de problèmes pour emprunter cette voie à cause de cela, j'ai donc fini par changer le code et travailler uniquement avec les valeurs de la colonne d'intérêt : d'abord en créant une matrice, puis en calculant simplement la ligne (n+1) -row(n) différence de la colonne et moyenne de la matrice.
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 );
Où "timefactor" est une variable qui dépend du fait que la colonne soit ou non en unités de jours, minutes, heures, etc.
Merci donc pour votre solution au problème initial de savoir comment envoyer une variable à une nouvelle fonction de colonne, mais malheureusement, j'ai dû emprunter une autre voie afin de résoudre la fonctionnalité du code dans son ensemble.
Merci!,
DS