je veux ajouter une nouvelle colonne de série avec une formule B2/A2,C2/A2... comme l'exemple ci-dessous
comment je l'implémente
Merci

colname = dt << get column names( string, continuous );
nc = N Items( colname );
For( p = 1, p < nc, p++,
For( i = 1, i < nc, i++,
a = "Bin" || Char( p );
b = Char( a ) || Char( "(%)" );
If( Contains( colname[i], a ),
dt << New Column( b, formula( :colname[i] / :name( "Total" ) ) )
);
)
);
S'il y a des caractères spéciaux dans le nom de la colonne, vous pouvez utiliser Parse( "As Column \!"" || colname[i] || "\!"" ) dans la substitution.Le message d'origine a essayé d'utiliser Name(), qui est difficile à utiliser dans les scripts car il n'accepte qu'une chaîne entre guillemets.
Agréable. J'aime le mix'n'match de manipulation d'expression et de manipulation de personnage à la fin !
1 Eval(
2 Substitute(
3 Expr(
4 dt << New Column( colname[i] || "%",format("Percent",7,2),
5 formula( __col__ / :name( "Total" ) ) )
6 ),
7 Expr( __col__ ),
8 Parse( ":" || colname[i] )
9 )
10 )</CODE>Les lignes 4 et 5 sont le JSL qui est manipulé comme une expression ; le __col__ est un espace réservé.</P><P>Les lignes 3 et 6 sont<EM> citant</EM> l'expression pour qu'elle n'essaie pas de s'exécuter.</P><P>La ligne 7 identifie le bit à remplacer, également<EM> cité</EM> donc il ne s'exécute pas.</P><P>La ligne 8 est la valeur de remplacement. Ceci est intéressant car il construit en fait du JSL comme une concaténation de deux chaînes, puis l'analyse en une expression. Le résultat de la fonction d'analyse est une expression.</P><P>Les lignes 2 et 9 sont les<EM> Substitut (source, motif, remplacement)</EM> fonction. Elle renvoie une expression construite à partir des trois arguments de l'expression.</P><P>Les lignes 1 et 10 évaluent l'expression.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-284389" slang="en-US">Re : comment ajouter une nouvelle colonne dans une ligne avec une boucle for</LINGO-SUB><LINGO-BODY id="lingo-body-284389" slang="en-US"><P>Vous rendiez le problème plus complexe qu'il ne devrait l'être.Vous trouverez ci-dessous une refonte de votre code, avec un peu d'annotation</P>
<PRE><CODE class=" language-jsl">Names Default To Here( 1 ); // This line tells JMP to isolate the variable used to this script
// Set a variable to point to the current active data table
dt = Current Data Table();
// Get the column names
colname = dt << get column names( string, continuous );
// Determine the number of columns to loop through
nc = N Items( colname );
// Loop across all of the columns in the colname list
// Your original code was For( i = 1, i < nc, i++,
// with "i < nc" the last colname would not be processed
For( i = 1, i <= nc, i++,
// If this is a column name that starts with "Bin"
// a new % column needs to be added
If( Left( colname[i], 3 ) == "Bin",
// Create the new column
Eval(
Substitute(
Expr(
dt << New Column( colname[i] || "%",format("Percent",7,2),
formula( __col__ / :name( "Total" ) ) )
),
Expr( __col__ ), Parse( ":" || colname[i] )
)
)
)
);