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