ループに関する簡単な質問こんにちは、
私は長年 JMP を使用していますが、スクリプトについて学び始めたのはつい最近のことです。 基本を学ぼうとしていますが、習得したい重要なことの 1 つは、for ループの使用です。
そこで、4 つの列を持つサンプル データセットを作成しました。
1) PATIENTID: 患者番号の一意の値のリスト
2) 値: 特定の時点での患者評価の値
3) TIME: 患者の評価が収集された時点
4) PARAM: 患者評価を 4 項目に分けて合計点
このデータ テーブルのすべての行を反復処理し、2 つの異なる変数 (:TIME と :VALUE) の値を評価するスクリプトを作成しました。 条件が満たされた場合、はいまたはいいえのいずれかである新しい列の行に文字値を追加したいと思います。
これが私が書いたスクリプトです。 JMP は、新しい列の各行に対して空の値を返します。
Names Default To Here( 1 );
dt = current data table ();
tr = N Rows (dt);
dt << New Column ("TEST", "CHARACTER",
For (i = 1, i <= tr, i++,
If(
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
)
)
;これは単純なスクリプトです。仕組みを理解したら、さらに条件を追加したいと思います。 しかし、スクリプトが正しく機能していないため、この時点で立ち往生しています。
また、For Each Row 関数を使用してこのスクリプトを作成しようとしましたが、それでも同じ問題が発生します。
私が間違っていることについて何かアドバイスはありますか? これが単純な答えである場合は申し訳ありません。ドキュメントを調べたところ、何が間違っているのかわかりません。
Re: ループについての簡単な質問ループは通常、テーブルの行またはリスト内の項目を反復するために使用されるため、1 ずつインクリメントするのが最も一般的です。 ただし、3 番目の引数は i++ であってはなりません。 それは理にかなっている何かである可能性があります。
いくつかの例:
For(i = 1, i <= 10, i = i + 0.1, Expr()); // Increment < 1 (100 iterations)
For(i = 10, i > 1, i--, Expr()); // Loop "backwards"
For(x = 2, x <= 10, x = 2, Expr()); // Eternal loop (better avoid these)
Re: ループについての簡単な質問ループが新しい列の定義内に配置されているため、機能しません。 列を作成してその値を別のステートメントに入力するか、列式を使用します。
同じ結果が得られるはずの次の 3 つの jsl の例を見てください。
Names Default To Here(1);
dt = Current Data Table();
tr = N Rows(dt);
//1. Fill values with a For() loop
dt << New Column("TEST", "CHARACTER");
For(i = 1, i <= tr, i++,
:TEST[i] = If(:TIME[i] == "BASELINE" & :VALUE[i] > 3,
"YES",
"NO"
)
);
//2. Fill with For Each Row()
dt << New Column("TEST2", "CHARACTER");
For Each Row(:TEST2 = If(:TIME == "BASELINE" & :VALUE > 3, "YES", "NO"));
//3. Use a column formula in TEST3
dt << New Column("TEST3",
"CHARACTER",
Formula(If(:TIME == "BASELINE" & :VALUE > 3, "YES", "NO"))
);
Re: ループについての簡単な質問実行したいタスクは、次の 2 つの方法で実行できます。
a) 列に Formula プロパティを使用します。
Names Default To Here( 1 );
dt = current data table ();
tr = N Rows (dt);
dt << New Column ("TEST", "CHARACTER",
Formula(
If(
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
)
)
;b) ループで繰り返す
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", "CHARACTER", Character, Nominal);
for(ii=1, ii<=N Rows(dt), ii++,
:test[ii]=If(
(:TIME[ii] == "BASELINE" & :VALUE[ii] > 3)
,"YES"
,"NO"
)
);For Each Row() を使用することもできます
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", "CHARACTER", Character, Nominal);
for each row(
:test=If(
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
);
Re: ループについての簡単な質問もう 1 つの質問:
JSL ドキュメントによると、for 関数の 3 番目の引数を使用して for ループがインクリメントされます。 私はこれが通常 i++ として書かれているのを見てきました。 これは、i をその場で 1 ずつインクリメントすることを意味すると思います。 しかし、1 未満の値でインクリメントしたい場合はどうすればよいでしょうか。 主張はどう書けばいい?
JSL ドキュメントとスクリプト インデックス ツールでは、これを行う方法については何も言及されていません。
ありがとうRe: ループについての簡単な質問これは、同じタスクを達成するために私が書いた同様のスクリプトですが、代わりに行ごとに関数。 これもうまくいきません。
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", "CHARACTER",
For Each Row (dt,
If (
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
)
)
;どんな助けでも大歓迎