Création d'un total cumulé d'une colonne<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Je me demande comment créer une colonne dans une table JMP qui correspond au total cumulé d'une autre colonne (que je devrai peut-être référencer via le nom de la colonne sous forme de chaîne). Autrement dit, si j'ai une colonne avec les données suivantes :
1
2
3
4
5
Je voudrais créer une colonne avec une formule dont le contenu fonctionnerait pour
1
3
6
dix
15
Actuellement, j'ai cette boucle, travaillant à partir d'une liste de noms de colonnes pour prendre le total cumulé de :
For(i = 2, i <= numCols, i++,
colName = colNames ;
col = Nouvelle Colonne("Cumulatif " || nomCol,
Formule(Sommation(j = 1, Ligne(), Comme Colonne(ColName)))
);
);
Cela semble fonctionner, mais c'est très lent et si je crée plusieurs colonnes, elles se retrouvent toutes avec les mêmes données d'une manière ou d'une autre. Quelle est la meilleure façon de procéder?
Re : Création d'un total cumulé d'une colonneAu fait, si la liste des colNames contient des noms au lieu de chaînes, cette approche semble donner le même résultat que la chaîne analysée :
colNames = dt << obtenir les noms de colonnes ( ) ; // Sans l'option "string" !
numCols = N articles ( colNames ) ;
Pour ( je = 1 , je <= numCols , je ++,
colName = colNames [ je ] ;
nouveau nom = "Cumulatif" || ( colName << obtenir le nom ) ;
col = Nouvelle colonne ( nouveau nom , Numérique , Continu ,
Formule ( Éval ( Remplaçant (
Expr ( Addition ( j = 1 , Ligne () , xxx [ j ])) ,
Expr ( xxx ) , colNames [ je ]
)))
) ;
) ;
Re : Création d'un total cumulé d'une colonneOui, cela devrait fonctionner tant que les colonnes ne sont jamais renommées.
Ce code illustre la différence entre les deux approches. La méthode de la chaîne laide code en dur la formule dans une colonne spécifique. La deuxième méthode recherche une colonne avec un nom spécifique (ce qui pourrait être utile)
// Exemple de tableau
dt = Nouveau tableau ( "Test" ,
Ajouter des lignes ( 4 ) ,
Nouvelle colonne ( "Col1" , Numérique , Définir les valeurs ( [ 1 , 2 , 3 , 4 ] ) )
) ;
// Ajoute la formule par chaîne analysée
colNames = dt << obtenir les noms de colonnes ( chaîne ) ;
numCols = N articles ( colNames ) ;
Pour ( je = 1 , je <= numCols , je ++,
colName = colNames [ je ] ;
col = Nouvelle colonne ( "Cumulatif" || colName , Numérique ) ;
Éval (
Analyser (
Insertion d'évaluation (
"col<< Set Formula(Summation(j = 1, row(), ^(ColName)^))"
)
)
) ;
) ;
// Ajoute une formule en remplaçant l'expression
Pour ( je = 1 , je <= numCols , je ++,
colName = colNames [ je ] ;
nouveau nom = "Cumulatif" || colName ;
col = Nouvelle colonne ( nouveau nom ,
Numérique ,
Continu ,
Formule (
Éval (
Remplaçant (
Expr (
Addition ( j = 1 , Ligne () , Comme colonne ( xxx )[ j ] )
) ,
Expr ( xxx ) , colName
)
)
)
) ;
) ;
Attendez ( 1 ) ;
// Modifiez le nom de la colonne et une valeur et regardez comment fonctionnent les formules
Colonne ( 1 ) << définir le nom ( "Nouveau nom" ) ;
Colonne ( 1 )[ 1 ] = 100 ;
Attendez ( 2 ) ;
// Ajoute une nouvelle colonne avec le même nom que la colonne d'origine.
dt << Nouvelle colonne ( "Col1" , numérique , valeurs ( [ 1 , 1 , 1 , 1 ] ) ) ;
dt << relancer les formules ;
Re : Création d'un total cumulé d'une colonneJ'ai l'impression que s'il existe un moyen de faire en sorte que JSL fasse ce que vous voulez en analysant une chaîne, alors il devrait être possible de le faire sans utiliser la fonction Parse, avec du code JSL brut (qui, après tout, n'est qu'une chaîne) . C'est ce que j'ai travaillé en utilisant Substitute:
For(i = 2, i <= numCols, i++,
colName = colNames ;
newName = "Cumulatif" || colName ;
col = Nouvelle Colonne(nouveauNom, Numérique, Continu,
Formule(Eval(Remplacer(
Expr(Sommation(j = 1, Ligne(), Comme Colonne(xxx))),
Expr(xxx), nomCol
)))
);
);
Re : Création d'un total cumulé d'une colonneFormula() n'évalue pas son argument, donc toutes les formules de colonne contiendront les variables ColName et J et seront mises à jour au fur et à mesure de la boucle.
Voici une façon de contourner cela :
Pour ( je = 2 , je <= numCols , je ++,
colName = colNames [ je ] ;
col = Nouvelle colonne ( "Cumulatif" || colName , Numérique ) ;
Éval (
Analyser (
Insertion d'évaluation (
"col<< Set Formula(Summation(j = 1, row(), ^(ColName)^))"
)
)
) ;
) ;