Code JSL nécessaire pour générer une colonne de formule dynamique qui additionne les colonnes d'une listeSalut tout le monde,
Cette question concerne un message ici qui génère bien une colonne non dynamique pour résumer une liste d'autres colonnes.
Le problème que je rencontre est de savoir comment résumer les colonnes (en utilisant JSL) lorsque vous avez une liste de N autres colonnes et que ce soit une formule dynamique.
J'ai une liste de colonnes dans ma table de données, disons ColList, et je souhaite générer une nouvelle colonne avec une formule qui additionne simplement les N éléments dans la ColList. Quelque chose que je pensais est comme ceci:
Names Default to Here (1);
dt = Current Data Table();
dt << New Column("Sum", Formula(Sum(ColList)));Cela ne fonctionne clairement pas car ColList est une liste de colonnes: ColList = {"col1", "col2", ..., "colN"}. J'ai essayé de créer une chaîne et d'utiliser Eval (Parse ()) et Eval Insert () comme ceci:
Names Default to Here (1);
dt = Current Data Table();
str = Eval Insert("dt << New Column(\!"Sum\!", Formula(Sum(Eval(ColList))));
Eval(Parse(str));Mais toujours pas de chance. Le code JSL générera la colonne avec une formule, mais aura des valeurs de ligne vides car il affiche toujours Eval (ColList) dans la formule au lieu d'être la formule réelle, qui devrait ressembler à: Sum (: col1,: col2,: col3, ...,: colN).
Je n'arrive pas à comprendre ce que je fais mal en passant de la liste {""} de colonnes à la référence aux colonnes avec les deux-points:.
Toute aide est très appréciée.
Merci!,
DS
AnalytiqueTableau de donnéesScriptingRe: code JSL nécessaire pour générer une colonne de formule dynamique qui additionne les colonnes d'une listeIl y a plusieurs moyens de le faire. Je préfère créer une variable pour l'expression souhaitée à l'aide de EvalExpr (), puis utiliser NameExpr () pour transférer l'expession (non évaluée) dans l'argument Formula ().
Names Default To Here( 1 );
dt = Open( "$Sample_Data/2D Gaussian Process Example.jmp" );
ColList = dt << Get Column Names;
F = Eval Expr( Sum( Expr( ColList ) ) );
dt << New Column( "Sum", Formula( Name Expr( F ) ) );
Re: code JSL nécessaire pour générer une colonne de formule dynamique qui additionne les colonnes d'une listesalut @Mme ,
C'est une solution parfaite, merci! J'aime sa simplicité et son élégance.
J'ai dû changer un peu mon code car le faire à votre façon a toujours un problème lorsque la liste est structurée comme: {"A", "B", "C", ...}. Mais, si la liste est structurée comme {A, B, C, ...} alors elle évalue l'expression très bien. Les deux listes sont générées légèrement différemment et les citations rejettent vraiment Eval ().
Merci!,
DS
Re: code JSL nécessaire pour générer une colonne de formule dynamique qui additionne les colonnes d'une listesalut @Mme ,
J'ai une question connexe (et donc pas un autre article) pour laquelle j'espère que votre méthode de script pourra vous aider. Cela a à voir avec la poste ici . Ce que j'essaie de faire maintenant, c'est essentiellement de généraliser ce qui a été mis dans le message d'origine d'une matrice de corrélation 4x4 à une matrice NxN arbitraire lors de l '"alimentation" des informations au simulateur dans le profil.
À partir de l'autre article d'origine, il existe un script qui peut générer la matrice de corrélation NxN, et à partir de votre entrée, peut générer une colonne «prédiction» (la somme des N autres colonnes). Là où je rencontre des difficultés, c'est le suivant: lorsque vous appelez la fonction Simulator (), vous disposez des éléments suivants pour la transmettre:
Simulateur (état = 0 | 1, , )
Donc, à partir de l'autre article d'origine, la solution pour passer la bonne liste de facteurs ("tpListY") et la matrice de corrélation ("corr.mat"), le code JSL nécessaire pour que Eval Insert () entoure l'appel à envoyer Simulator () au rapport Profiler, puis exécutez une évaluation (Parse ()) autour de cela.
Le défi consiste maintenant à généraliser correctement cela afin que, lors de l'appel de Simulator () et de la définition des facteurs, vous puissiez le faire sur cette ColList.
ColList pourrait être quelque chose comme: ColList = {A, B, C, D, ...} et il y a une moyenne et un écart type associés pour chaque colonne A, B, C, ....
Quelle est la bonne syntaxe pour appeler le simulateur afin qu'il insère la bonne moyenne et Std Dev pour chaque facteur? Exemple:
sim_design = Profiler(Y(:Pred), Invisible);
new = Eval Insert(
"sim_design << Simulator(
1,
Factors(
:A << mutlivariate(Mmean[1], MSD[1])),
:B << mutlivariate(Mmean[2], MSD[2])),
:C << mutlivariate(Mmean[3], MSD[3])), //etc. for the N columns in the made up table.
),
X Correlations(
1,
Eval(ColList),
Eval(corr_mat)
),
NRuns(1e6)
);");
Eval(Parse(new));A partir de la table de données d'origine, une seconde maquette est réalisée avec le nombre de colonnes (N) qui ont été utilisées pour générer la matrice de corrélation (corr_mat). Cette maquette de table est celle qui additionne les colonnes pour créer la colonne: Pred qui est utilisée comme fonction factice à envoyer au Profiler. Les variables Mmean et MSD sont des vecteurs qui contiennent la moyenne et l'écart type des N colonnes A à n'importe quoi.
Sans avoir à écrire explicitement dans chaque colonne et leur moyenne correspondante, j'aimerais que cela soit plus automatisé afin qu'il puisse gérer n'importe quel nombre de colonnes.
Quelle serait une bonne façon de procéder?
J'ai également des problèmes avec Eval (corr_mat) entrant réellement les valeurs de la matrice de corrélation dans les entrées X Correlations.
La table de données et le script joints devraient aider à comprendre ce que je tente.
Merci!,
DS
La mise à jour, désolé a ajouté le mauvais fichier, a maintenant une table de données correcte.
Re: code JSL nécessaire pour générer une colonne de formule dynamique qui additionne les colonnes d'une listeVoici une approche. Construisez d'abord de manière itérative les facteurs (), puis dans une deuxième étape, créez l'expression Simulator () complète, y compris les arguments évalués pour les corrélations X ().
// Iteratively build the Factors expression
fs = Expr( Factors() );
For( i = 1, i <= N Items( ColList ), i++,
Insert Into(
fs,
Eval Expr( Expr( collist[i] ) << multivariate( Expr( MMean[i] ), Expr( MSD[i] ) ) )
)
);
// Make the complete Simulator expression
sim = Eval Expr(
sim_design << Simulator(
1,
Expr( Name Expr( fs ) ),
X Correlations( 1, Expr( ColList ), Expr( corr_mat ) ),
N Runs( 1e4 )
)
);
// Name Expr( sim ) // Run this line to show the expression in the log
// Launch Profiler and run the Simulator expression
sim_design = Profiler( Y( :Pred ) );
sim;
Cependant, la matrice de corrélations X semble (dans la plupart des cas) ignorée. Seuls les zéros dans le rapport.
De même, lorsque les corrélations sont entrées manuellement dans le profileur et que vous enregistrez et exécutez le script, les corrélations sont perdues. Même s'ils sont conservés dans le script enregistré. Pas certain de pourquoi.
Re: code JSL nécessaire pour générer une colonne de formule dynamique qui additionne les colonnes d'une listesalut @Mme ,
Merci beaucoup pour votre solution. Cela fonctionne très bien pour mes tables de données avec lesquelles je travaille. J'ai eu besoin de modifier un peu les choses pour tenir compte du fait que de nombreuses tables de données avec lesquelles je travaille ont d'autres types de données, donc je n'ai besoin que de considérer les données numériques continues. Quoi qu'il en soit, cela fonctionne correctement et remplit correctement les moyennes multivariées, les développeurs std et les corrélations X. J'utilise JMP 16 EA, si cela compte.
Merci pour ton aide! J'ai également posté dans l'autre fil de la demande originale concernant la matrice de corrélation afin que la personne puisse, espérons-le, bénéficier du code pour passer à N dimensions.
Merci!,
DS