forループは式を正しく評価しません。<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />データテーブルに新しい列を作成しようとしています。新しい列はそれぞれ既存の列のZスコアです。 これは私が持っているものです
Colnames_1st = dt_zscore3 << Get Column Names();
nlist = N個のアイテム(列名_1st)。
(i = 5、i <= 10、i ++、
var1 =列(列名_1st ;
mean = Col Mean(var1);
stdev = Col Std Dev(var1);
namevar = char(Colnames_1st ;
新しい列( "Zscore" || namevar、
数値、連続した、
フォーマット( "最高"、12)、
式(((((var1 []) - 平均)/ stdev)));
;
コードは6つの新しい列を作成し、それらに正しく名前を付けます。
しかし、すべての列の値を埋めようとすると、正しく行われません。
すべての列は、各行で同じ値になります。 それは私のように見えます
列を作成していますが、次にforループが計算されるまで待機します。
すべての列の各行に入る値なので、allの最後の値を使用します。
それぞれの式を計算する代わりに、すべての列の変数
その列で使用されるべき値を使用して列を作成します。
私は本当に立ち往生しています。 私はいろいろなことを試みたが、このハードルを乗り越えることはできない。
どんな助けでも大いに感謝されるでしょう。
再:forループは式を正しく評価しません。私はあなたの解決策に問題があるかもしれないと思います。列が作成されたときには機能しますが、別のセッションでは機能しない場合や、データがソース列で変更または追加された場合は機能しません。
新しい列の式を見ると、すべて "(var1 [] - mean)/ stdev"のように見えます。これらの変数名は、現在のスクリプトのコンテキスト内(または特定のforループの反復内でさえ)でのみ意味があります。変数が再定義またはクリアされた場合、式は正しく機能しません。
Formula()引数の変数は明らかに評価されず文字通りに解釈されるので、式は文字通りに入力されるべきです。forループなどで変数を使用する必要がある場合は、文字列または式を操作してこれを実現できます。
evalexpr()を使用して式を評価する前に式内の式を評価する例
dt = 開いた ( "$ SAMPLE_DATA / Big Class.jmp" ) ;
n = Nコル ( dt ) ;
にとって ( 私 = 4 、私 <= n 、私 ++、
var1 = カラム ( 私 ) ;
評価 (
評価エキス (
dt << 新しいコラム ( "Zスコア" || ( var1 << 名前をつける ) 、
数値 、
連続的 、
式 ( コル標準化 ( 経験値 ( var1 ) ) )
)
)
) ;
) ;
再:forループは式を正しく評価しません。私はついに解決策を見つけたと思います。
私の問題はどういうわけか変数をローカル変数とグローバル変数のどちらに定義するかにあると感じていますが、何をしようとしてもそれをどうやって修正すればよいのかわかりませんでした。
代わりに私はラインを追加しました
dt_zscore3 <<式を実行
そして今それは正しくそれを行います。
Colnames_1st = dt_zscore3 << Get Column Names();
nlist = N個のアイテム(列名_1st)。
(i = 5、i <= nlist、i ++、
デフォルトはここにあります(1)。
var1 =列(列名_1st ;
// var1 = Column(Colnames_1st ;
mean = Col Mean(var1);
stdev = Col Std Dev(var1);
namevar = char(Colnames_1st ;
新しい列( "Zscore" || namevar、
数値、連続した、
フォーマット( "最高"、12)、
式(((((var1 []) - 平均)/ stdev)));
dt_zscore3 <<式を実行
;
これはおそらくエレガントではないか、またはそれを実行するための最も正しい方法ではありませんが、だれかが有用であると考える場合に備えて、私はそれを投稿します。