<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />数式のスクリプトの作成方法 (数式内の参照列に関するものを使用して、同じ数式を複数の列に適用する) についての質問をよく受けます。 通常、これは初心者がスクリプトを作成し始めるための入り口でもあります。
私は最近、定期的なディスカッション セクションに質問を投稿し、顧客の参加 (参加しませんでした) と専門家のアドバイス (これを読んでいる人全員) の両方を試みました。 私は、この質問が来たときに人々に指摘できる確かな答えを生成したいと心から思っています。 たとえば、列が 1000 以上ある場合などに、提案された回答が本当に最適な方法でしょうか?
これに関する助けをいただければ幸いです。 またはブログエントリー。 それとも、これが他の場所で取り上げられていると指摘しますか?
定期的なディスカッションは次のとおりです。
列式をスクリプトで多数の列に分割する最良の方法は?
ありがとう!
前の内容のフォローアップとして、列名に :Name() 関数を使用していることがわかります。 これにより、列名に興味深い文字が含まれることで発生する問題を回避できます。 常に必要というわけではありませんが、やはり防弾です。
Don の発言に従って、Eval(Parse(Substitute())) を使用して、さらに一歩進んでいることによく気づきます。
これは事実上、実際にコードを動的に記述することになります。 ややエレガントではありませんが、ほぼ防弾です。 この構成は (文字の置換のため) 常に最も効率的であるとは限りませんが、他のすべてのトリックが失敗した場合に成功する構成であるため、知っておくと良いでしょう。 最も重大な欠点は、引用符のために色分けが見えないことです。
デフォルトの名前はここにあります( 1 ) ;
dt =開ける( "$Sample_Data/football.jmp" ) ;
コードフラグ= 「\[
新しい列( "_colName_ 平均からのランク",
数値、
「連続」、
Format( "ベスト", 12 ),
Formula( Col Rank( Abs( Col Mean( :Name( "_colName_" )) - :Name( "_colName_" ) ) )
)
]\" ;
列リスト= dt <<列名を取得する(弦) ;
のために(私= 1 、私<=ナイアイテム(コリストする) 、私++、
もし(カラム( dt 、列リスト[私]) <<モデリングタイプを取得する== 「連続」 、
評価(解析する(代わりの(コードフラグ、 「_colName_」 、列リスト[私])))
)
) ;
カラーコーディングがないことが気になる場合は、以下のように文字列を char(nameexpr()) 構造でラップすることで維持できます。 これにより複雑さが増しますが、デバッグ目的でコードを作成する際には価値があるかもしれません...機能したら、いつでも char(nameexpr()) 部分を削除し、「\[ ]\」を使用して引用符で囲むことができます。
結論: これは美人コンテストで優勝することはありませんが、自分で文字列を作成し、それを解析して評価すると、求めているものは得られます。 Eval(EvalExpr( ... Expr() .... )) が失敗し、その理由を理解できません (または理解する時間がない、または気にしません)。
デフォルトの名前はここにあります( 1 ) ;
dt =開ける( "$Sample_Data/football.jmp" ) ;
コードフラグ=文字(名前式(
新しい列( 「_colName_ 平均からのランク」 、
数値、
「連続」 、
フォーマット( "最高" 、 12 ) 、
式(コルランク(腹筋(コル・ミーン( :名前( 「_colName_」 )) - :名前( 「_colName_」 ) ) ) )
)
)) ;
列リスト= dt <<列名を取得する(弦) ;
のために(私= 1 、私<=ナイアイテム(コリストする) 、私++、
もし(カラム( dt 、列リスト[私]) <<モデリングタイプを取得する== 「連続」 、
評価(解析する(代わりの(コードフラグ、 「_colName_」 、列リスト[私])))
)
) ;
乾杯、
ブレイディ
ローラ、
フォーラムで与えられた答えは、コードを必要以上に複雑化しない堅実なアプローチだと思います。 この状況では Expr と Name Expr の使用は避けられないと思います。 次のステップとして、ループから数式を削除して、コードをより汎用的にすることを検討できます。 このようにして、数式を引数として受け取る関数を作成できます (添付の JSL を参照)。 おそらくこれを行うためのもっと簡単な方法があると思いますが、私は Substitute を使用することに慣れています (そしてそれは非常に堅牢です)。 [Row()] 部分がなぜ必要なのかはわかりませんが、統計列関数内を除いて列を参照する場合に必要です。 これが何らかの洞察を提供することを願っています。
ドン