行の反復に関する質問こんにちは、
これまでのすべての返信にとても感謝しており、JSL について毎日さらに勉強しています。 この時点で、私は基本に慣れており、次のことを学びました。のためにループ、各行についてとの使用式関数。 これはとても役に立ちました。 前回の投稿で述べたように、私はデータセットに取り組んでおり、4 つのキー列があります。
1) PATIENTID: 患者番号の一意の値のリスト
2) 価値: 特定の時点での患者評価の価値
3) TIME: 患者の評価が収集された時点
4) PARAM: 患者評価は 4 つの個別項目と合計スコア (ITEM1、ITEM2、ITEM3、ITEM4、および TOTAL) で構成されます。 合計スコアは、ITEM1+ITEM2+ITEM3+ITEM4 の単純な合計です。
ここから、5 番目の列 (「TEST」という名前) を作成したいと思います。 TEST の値は、次のロジックに基づいています。
個々の患者の場合、ベースライン値は次のとおりです。
- 合計 > 9 または
- ITEM1、ITEM2、ITEM3、または ITEM4 のうち 1 つが 3 を超える、または
- ITEM1、ITEM2、ITEM3、または ITEM4 のうち 3 つが 2 を超えています
次に、「TEST」の対応する行は「YES」と評価されます。 ベースライン以外の値、およびその他の値は「いいえ」と評価される必要があります。 このロジックは、すべての患者とデータテーブルのすべての行に対して反復される必要があります。
データセット内の行を反復処理する際に問題が発生します。 その理由は、各患者がスケールに記入した時点の数が異なるためです。 早期に脱落する患者もいた。 患者ごとに行数が異なるため、行を反復処理してスクリプトを作成する方法を理解するのが困難です。
いくつかの IF ステートメントを組み合わせてみましたが、次の患者 ID まで繰り返す必要がある時点で行き詰まってしまいました。 私が書いたスクリプトを添付しますが、行き詰まってしまいました。 ご協力をよろしくお願いいたします。
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", Character, Formula(
If(:TIME == "BASELINE",
theRow = Row();
thePatient = :PATIENTID;
If(:PARAM == "TOTAL",
If(N Rows(dt << Get Rows Where(
Row()>=theRow &
thePatient == :PATIENTID &
:VALUE > 9
)
) > 0
,"YES"
,"NO"
)))
));データテーブルの例を次に示します (プライバシーのために編集された実際の患者情報)

Re: 行の反復に関する質問ありがとう、もう完全に理にかなっています。 時間を割いて説明していただき、とても助かりました!!
Re: 行の反復に関する質問@sriharigopal 、
最初の投稿では、数式と Set Each Value() が行をどのように反復処理するかを説明しました。そこで、留意すべき情報をいくつか紹介します。
- 論理ステートメントは True または False として評価されます。 True は 1 に相当し、False は 0 に相当します。
- x が数値であると仮定します。 JSL 関数 If( x, "YES", "NO" ) は x の値を調べます。 x > 0 の場合、結果は True(1)=>YES となり、それ以外の場合は False(0)=>NO になります。
- :TIME == "BASELINE" は 1 または 0 を返す論理ステートメントなので、"AND" (&) を使用する代わりに乗算関数が機能します。 つまり、TIME は BASELINE と等しく、ルールの 1 つが true、つまり 1*1 = 1 である必要があります。 どちらかが false の場合、結果は 0 または false になります。
- 外側の Maximum() 関数には 3 つの引数と 3 つのルールがあります。 この最大関数は「OR」( | )を置き換えます。 3 つのルールがすべて false の場合、外側の最大値は 0 を返します。 3 つのルールのいずれかが 1 (True) を返した場合、最大値は 1 を返します。 ただし、この結果には論理乗数が含まれているため、これは BASELINE 値にのみ適用されることに注意してください。
- ルールに関して: ルール #1 ( :TOTAL > 9 ) は 1 または 0 を返します。ルール #2 は 4 つの項目の最大値を見つけ、それが 3 より大きい場合、少なくとも 1 つの項目が 3 より大きいことになります。 ルール #3 は、4 つの論理結果の合計です (ITEM 1 >2 など)。その合計が 2 より大きい場合、3 つまたは 4 つの項目が 2 より大きくなります。
論理ステートメントで算術演算を使用すると、「k of n」ルールを満たすケースを簡単かつ迅速に見つけることができます。 4 つの ITEM を連結して、それらが { "0111"、"1011"、"1101"、"1110"} にあるかどうかを確認するか、数値にしてそれらの値を探すなどの他の方法もあります。ただし、合計には 1 回のチェック (>2) だけが必要です。ルール #3 には算術演算を使用していたので、残りのロジックには OR の代わりに Maximum() という算術関数を使用し、AND の代わりに乗算を使用しました。論理関数と数学関数を混合したステートメントを使用できることに注意してください。
それが役立つことを願っています。
Re: 行の反復に関する質問どうもありがとうございます! これは完璧に機能しました。
台本を読んでいるのですが、もう少し説明していただけないでしょうか。 このコンテキストでは MAXIMUM 関数はどのように機能しますか? 最大 3 つのルールを探しているとのことですが、 ただし、* 演算子が表示されます。これは乗算を意味すると思います。 IF ステートメントで乗算と MAXIMUM 関数がどのように連携するかについて混乱しました。
どうもありがとう!Re: 行の反復に関する質問@sriharigopal 、
あなたは自分の目標を次のように述べました
個々の患者の場合、ベースライン値は次のとおりです。
- 合計 > 9 または
- ITEM1、ITEM2、ITEM3、または ITEM4 のうち 1 つが 3 を超える、または
- ITEM1、ITEM2、ITEM3、または ITEM4 のうち 3 つが 2 を超えています
次に、「TEST」の対応する行は「YES」と評価されます。 ベースライン以外の値、およびその他の値は「いいえ」と評価される必要があります。 このロジックは、すべての患者とデータテーブルのすべての行に対して反復される必要があります。
積み上げテーブル内の複雑なルールも実行できますが、煩雑になります。 テーブルが PATIENTID と TIME によってアンスタックされ、ルールが PARAM によって適用される場合、管理がはるかに簡単になります。 テーブルが非常に大きい場合、この方法は効率的ではない可能性があります。
3 つのルールをテストするための 2 つの追加 PATIENTID を含むテーブルの例を添付します。添付のスクリプトを使用する前に、数式が 3 つのルールを適切に捉えているかどうかを確認する必要があります。 コメント欄と色を追加して確認しやすくしました。

分割したら、3 つのルールの TEST 列の式を次に示します。 このスクリプトには、テーブルのスタックを解除して再編成するための JSL コードも含まれています。
dt_split:TEST << Set Each Value(
If(
(:TIME == "BASELINE") *
Maximum(
:TOTAL > 9, //rule 1
Maximum( :ITEM1, :ITEM2, :ITEM3, :ITEM4 ) > 3, //rule 2
(:ITEM1 > 2) + (:ITEM2 > 2) + (:ITEM3 > 2) + (:ITEM4 > 2) >= 3 //rule 3
),
"YES",
"NO"
));
。