数式を含む列を繰り返し作成します。仕様制限のある列を反復処理し、それらに対して分析を実行したいと思います。
New Column("WM Minus Target", Numeric, "Continuous", Format("Best", 10), Formula(:WN - (:WN << get property("Spec Limits"))["Target"]), Set Selected);ここにあるスクリプトは私が求めているものに近いです。
解決済み: 仕様がオンの場合、失敗名を記述したいときにスクリプトをどのように記述すればよいですか? - JMP ユーザー コミュニティ
もっと複雑な式をどうやって得るのか知りたいだけですか?
ありがとう
スパナヘッド
自動化とスクリプトRe: 数式を含む列を繰り返し作成します。ここに 1 つの方法があります。2 つのリストではなく連想配列を使用する方がエレガントかもしれませんが、2 つのリストを使用する方が理解しやすいです。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
lstCols = {};
lstTargets = {};
//get cols with targets
For Each( {i}, 1 :: N Col( dt ),
t = .;
Try( t = (Column( i ) << Get Property( "Spec Limits" ))["Target"], );
If( !Is Missing( t ),
Insert Into( lstCols, i );
Insert Into( lstTargets, t);
);
);
//make formulas
For Each( {i, j}, lstCols,
//i = 5; j = 1;
dt << New Column( char(Column Name( i )) || " Minus Target",
Numeric,
"Continuous",
Format( "Best", 10 ),
Formula( as column(Column( i )) - lstTargets[j] )
)
);
/*JMP STATISTICAL DISCOVERY LLC (“JMP”) PERMITS THE USE OF THIS COMPUTER SOFTWARE CODE (“CODE”) ON AN AS-IS BASIS AND AUTHORIZES YOU TO USE THE CODE SUBJECT TO THE TERMS LISTED HEREIN. BY USING THE CODE, YOU AGREE TO THESE TERMS. YOUR USE OF THE CODE IS AT YOUR OWN RISK. JMP MAKES NO REPRESENTATION OR WARRANTY, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRIGEMENT, AND TITLE, WITH RESPECT TO THE CODE.
You may use the Code solely as part of a software product you currently have licensed from JMP, JMP’s parent company SAS Institute Inc. (“SAS”), or one of JMP’s or SAS’s subsidiaries or authorized agents (the “Software”), and not for any other purpose. The Code is designed to add functionality to the Software but has not necessarily been tested. Accordingly, JMP makes no representation or warranty that the Code will operate error-free. JMP is under no obligation to maintain, support, or continue to distribute the Code.
Neither JMP nor its licensors shall be liable to you or any third-party for any general, special, direct, indirect, consequential, incidental, or other damages whatsoever arising out of or related to your use or inability to use the Code, even if JMP has been advised of the possibility of such damages. Except as otherwise provided above, the Code is governed by the same agreement that governs the Software. If you do not have an existing agreement with JMP or SAS governing the Software, you may not use the Code.
JMP and all other JMP Statistical Discovery LLC product or service names are registered trademarks or trademarks of JMP Statistical Discovery LLC in the USA and other countries. ® indicates USA registration. Other brand and product names are registered trademarks or trademarks of their respective companies.
*/
Re: 数式を含む列を繰り返し作成します。そしてもう一つの方法があります
Names Default To Here( 1 );
dt =
// Open Data Table: semiconductor capability.jmp
// → Data Table( "semiconductor capability" )
Open( "$SAMPLE_DATA/semiconductor capability.jmp" );
colNames = dt << get column names( continuous, string );
For each( {col}, colNames,
Eval(
Eval Expr(
theTarget = (Column( Eval( col ) ) << get property( "Spec Limits" ))["Target"];
New Column( Expr( col ) || " Minus Target",
Numeric,
"Continuous",
Format( "Best", 10 ),
Formula( As Column( Eval( col ) ) - Expr( theTarget ) )
);
)
);
);Re: 数式を含む列を繰り返し作成します。コードは機能しますが、結果の列の数式を見ると次のようになります。
As Column( Column( i ) ) - lstTargets[j]
Re: 数式を含む列を繰り返し作成します。面白そうですが、エラーになります。名前が解決されていません: 'theTarget' のアクセスまたは評価で theTarget が見つかりません、theTarget/*###*/
Re: 数式を含む列を繰り返し作成します。Eval(Evalexpr()) を使用しないと、実行前に数式コードを完全に展開することはできません。以下の修正したコードを試してください。
Names Default To Here( 1 );
dt =
// Open Data Table: semiconductor capability.jmp
// → Data Table( "semiconductor capability" )
Open( "$SAMPLE_DATA/semiconductor capability.jmp" );
colNames = dt << get column names( continuous, string );
For Each( {xcol}, colNames,
col = xcol;
theTarget = (Column( Eval( col ) ) << get property( "Spec Limits" ))["Target"];
Eval(
Eval Expr(
New Column( col || " Minus Target",
Numeric,
"Continuous",
Format( "Best", 10 ),
Formula( As Column( Eval( col ) ) - Expr( theTarget ) )
)
)
);
);Re: 数式を含む列を繰り返し作成します。Jim の Eval() ソリューションは、私の例でも数式が適切に表示されるようにする方法と似ているはずです。
Re: 数式を含む列を繰り返し作成します。分析に応じて、各測定値に新しい列を追加するか、最初にテーブルを積み重ねて 1 つの新しい列を作成できます。
各パラメータに新しい列を追加する
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
cont_cols = dt << Get Column Names("Continuous", "String");
cols_created = {};
For Each({cont_col}, cont_cols,
specs = Column(dt, cont_col) << Get Property("Spec Limits");
If(Is Empty(specs), // skip columns without specs
Continue();
);
cur_target = Try(specs["Target"], .); // If target isn't set -> use 0 (could for example use USL - LSL?)
new_col = Eval(Substitute( // generally I use Eval(EvalExpr()) but in this case this makes expression more clear
Expr(dt << New Column(cont_col || " Minus Target", Numeric, Continuos, Formula(
_curcol_ - _targetval_
))),
Expr(_curcol_), Name Expr(AsColumn(dt, cont_col)),
Expr(_targetval_), cur_target
));
// new_col << Suppress Eval(1);
Insert Into(cols_created, new_col << get name);
);
最終的に次のような列になります (列のプロパティを変更してもターゲットは更新されません)

スタッキング
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
cont_cols = dt << Get Column Names("Continuous", "String");
ml = dt << Manage Limits(Process Variables(Eval(cont_cols))); // in this case this will open very annoying "help" window due to inconsistencies
dt_limits = ml << Save to Tall Limits Table;
ml << close window;
dt_stack = dt << Stack(
columns(Eval(cont_cols)),
Source Label Column("Measurement"),
Stacked Data Column("Data"),
Output Table("Data Stacked")
);
// If you don't care about LSL/USL they could be dropped from update
dt_stack << Update(
With(dt_limits),
Match Columns(:Measurement = :Variable),
Replace Columns in Main Table(None)
);
dt_stack << New Column("Data Minus Target", Numeric, Continuous, Formula(
:Data - :Target
));
どちらのデータ形式にも長所と短所があり、それは何を行うかによって異なります。
編集:
これは列プロパティから値を取得しますが、再評価は行われません (避けられる場合は、実際にはこれを使用しません)
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
cont_cols = dt << Get Column Names("Continuous", "String");
cols_created = {};
For Each({cont_col}, cont_cols,
specs = Column(dt, cont_col) << Get Property("Spec Limits");
If(Is Empty(specs), // skip columns without specs
Continue();
);
new_col = Eval(Substitute( // generally I use Eval(EvalExpr()) but in this case this makes expression more clear
Expr(dt << New Column(cont_col || " Minus Target", Numeric, Continuos, Formula(
_curcol_ - (_curcol_ << Get Property("Spec Limits"))["Target"]
))),
Expr(_curcol_), Name Expr(AsColumn(dt, cont_col))
));
//new_col << Suppress Eval(1);
Insert Into(cols_created, new_col << get name);
);