Comment appliquer une formule à toutes les colonnes d’un autre tableau ?J'essaie de prendre un tableau et d'appliquer une moyenne mobile à chaque fonction de chaque colonne. Le script ci-dessous est ce que j'essaie, basé sur ce que j'ai vu dans un autre fil de discussion ici. Le but est de créer une nouvelle table puis d'appliquer la fonction tout en référençant l'original. Cependant, je reçois toujours une erreur d’accès à la table de données étendue.
Test = Open("C:\Users\abrokaw\Desktop\JMP MA Test Table.jmp"); //open value data table
Testcols = Test << Get Column Names( string ); //get column names
TestMA = New Table( "Test Table Smoothed" ); //make new table
TestMA << add rows(nrows(Test)); //make new table match rows with raw table
For( i = 1, i <= N Cols( Test ), i++,
Eval(
Parse(
"TestMA << New Column( \!"MA_" || Testcols[i] || "\!",
numeric,
continuous,
formula( test:" ||
Testcols[i] || "Col Moving Average( :Value, 1, 2, 2 ) ) )'"
)
)
);
TestMA << delete columns("column 1");
Automatisation et scriptsAnalyse et modélisation des données de baseRe : Comment appliquer une formule à toutes les colonnes d'un autre tableau ?Vous avez placé la référence à la colonne dans la table Test au mauvais endroit. De plus, je suis passé de l'utilisation d'un format à l'utilisation de Définir chaque valeur. Le calcul final est le même, mais la colonne n'est pas une colonne de formule. Cela a pour résultat que la nouvelle table de données est indépendante de la table Test. J'ai également modifié la valeur de fin de la boucle For(). Puisque vous incluez 2 lignes avant et après, vous ne pouvez pas calculer au-delà de nrows-2
names default to here(1);
Test = Open( "$SAMPLE_DATA/blood pressure.jmp" ); //open value data table
Testcols = Test << Get Column Names( string, continuous ); //get column names
TestMA = New Table( "Test Table Smoothed" ); //make new table
TestMA << add rows( N Rows( Test ) ); //make new table match rows with raw table
For( i = 1, i <= N Cols( Test )-2, i++,
Eval(
Parse(
"TestMA << New Column( \!"MA_" || Testcols[i] ||
"\!",
numeric,
continuous,
set each value( Col Moving Average( test:" || Testcols[i] || ", 1, 2, 2 ) ) )"
)
);
);
TestMA << delete columns( "column 1" );
Enfin, veuillez utiliser l'icône JSL en haut de l'écran d'aperçu pour saisir votre code. Cela rend la lecture beaucoup plus facile.
Le code ne nécessite en fait pas la complexité du code Eval(Parse()). Il peut simplement utiliser du code ouvert
Names Default To Here( 1 );
Test = Open( "$SAMPLE_DATA/blood pressure.jmp" ); //open value data table
Testcols = Test << Get Column Names( string, continuous ); //get column names
TestMA = New Table( "Test Table Smoothed" ); //make new table
TestMA << add rows( N Rows( Test ) ); //make new table match rows with raw table
For( i = 1, i <= N Cols( Test ) - 2, i++,
TestMA << New Column( "MA_" || Testcols[i],
numeric,
continuous,
set each value( Col Moving Average( test:Testcols[i], 1, 2, 2 ) )
)
);
TestMA << delete columns( "column 1" );
Re : Comment appliquer une formule à toutes les colonnes d'un autre tableau ?Vous pouvez également utiliser Subset pour copier les colonnes (cela copiera également les scripts de table et autres, ce qui peut être un avantage ou un problème). N'oubliez pas d'utiliser Copier la formule (0) si vous optez pour l'option Sous-ensemble et utilisez des colonnes de formule pour les calculs.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
cont_cols = dt << Get Column Names(string, continuous);
ma_cols = {};
For(i = 1, i <= N Items(cont_cols), i++, // could use For Each but I try to avoid ... Each loops nowadays
//Eval(EvalExpr()) isn't necessary here but makes debugghing much easier
new_col = Eval(EvalExpr(
dt << New Column("MA_" || cont_cols[i], Numeric, Continuous, Formula( // I also try to avoid Set Each Value in cases like this so I use Formula here
Col Moving Average(Expr(NameExpr(AsColumn(dt, cont_cols[i]))), 1, 2, 2)
));
));
Insert Into(ma_cols, new_col << get name);
);
dt_new = dt << Subset(All Rows, Columns(ma_cols), Copy Formula(0), Output Table("Moving Averages"));
dt << Delete Columns(ma_cols);Re : Comment appliquer une formule à toutes les colonnes d'un autre tableau ?Merci, Jim. Ce changement fonctionne pour un ensemble de données de test que j'ai créé. Cependant, je rencontre toujours un problème avec le même message d'erreur sur mon ensemble de données réel. Je pense que cela a quelque chose à voir avec les noms de colonnes, car lorsque je copie les noms de colonnes de mon ensemble de données réel vers mon ensemble de test, j'obtiens également la même erreur. Y a-t-il certains caractères dans un nom de colonne qui pourraient provoquer ce problème ?