他の列からの何らかのパターンに基づいて 2 つの列を生成しようとしていますこんにちは、みんな、
他の 2 つの列 (「Required columns1」と「Required Column2」) のパターンに基づいて 2 つの新しい列を生成しようとしています。 添付画像をご覧ください -

何か助け/提案はありますか?
ありがとう。
品質およびプロセスエンジニアリングRe: 他の列からのパターンに基づいて 2 つの列を生成したいと考えていますありがとう@jthi素敵な説明のために。
Re: 他の列からのパターンに基づいて 2 つの列を生成したいと考えています1.おそらくこの画像は、最初のアイデアが機能しない理由を説明しています(私の記憶が正しければ、計算すると2番目の解決策はそれに依存します) 。 +1そうなる。 

If ステートメントからさまざまな比較を取得し、それらから数式を作成しただけなので、何がいつ True を返すかを簡単に確認できます。
比較を少し変更することで、最初の解決策を機能させることができる可能性が高くなります (がありません(:StartEnd) & Lag(:StartEnd) != "終了" | :StartEnd == "終了"、val += 1 )。 ただし、この変更により、2 番目の比較にも小さな変更を加える必要があります (Row() != Col Max(Row()) チェックを追加)。
2. アイデアRow() == Col Max(Row()) & :StartEnd == "開始"これは、テーブルの最後の行にいて、:StartEnd 値が「Start」であるかどうかを確認するためだけです。前の if ステートメントに基づいて値を 1 に設定しません。 Row() は行番号を示し、Col Max(Row()) はデータテーブル内の最大行番号を返します。 テーブルの最後の行(開始/終了の後の行など)なので、少し不要なチェックかもしれませんが、結果の列にあったので、それらを実装しました。
最後の if-else の一般的な考え方は次のとおりです。
1. Lag(:StartEnd) == "End" -> これは、End がカウンターされた後の一般的な "停止" です
2. Row() == Col Max(Row()) & :StartEnd == "Start" -> 最後の行が Start の場合に 1 を返さないようにします
3. :StartEnd == "Start" & Lag(:StartEnd, -1) == "End" -> Start と End の間に行がない場合に 1 と 2 を返さないようにします。
一部の比較を少し移動することで、複数の比較で 1 つの if だけを使用できます (これは Req1 と同じ結果を返すように見えます)。
If(
Row() == 1, val = .,
Row() != Col Max(Row()) & :StartEnd == "Start" & Lag(:StartEnd, -1) != "End", val = 1,
Is Missing(:StartEnd) & Lag(:StartEnd) != "End" | :StartEnd == "End", val += 1,
val =.
)
説明が雑すぎないことを祈ります
Re: 他の列からのパターンに基づいて 2 つの列を生成したいと考えていますこんにちは、みんな、
別のクエリ、実際には 2 つあります -
1. 単一の「If」ステートメントに複数の条件を追加する場合と、単一の条件を使用して複数の「If」ステートメントを追加する場合の違いは何ですか。 添付画像を参照してください - 。 最初のケースでは正しい結果が得られませんが、2 番目のケースでは正常に動作します。 結果は添付のサンプル データで確認できます。 ここの違いを理解するのが難しいです。
私にはそれが行ごとにあるようです - 最初のケースでは、条件が true の場合、出力が与えられます。 これで結果は終わりです。
2 番目のケースでは、前のステートメントの結果に関係なく、3 つの if ステートメントすべてが順番に実行され、出力は最後の true 条件に基づきます。 正しく説明できるか自信がありません。 繰り返しになりますが、2 番目のケース (複数の if ステートメント) では、前の If ステートメントが一種の上書きされていると思います。

2. 上の式には条件が使用されています -- " Row() == Col Max(Row()) & :StartEnd == "Start" " これはどのように機能しますか? うまく機能するということは、よく書かれているということです。 しかし、変数/カウンタ「val」がどのように停止するのかを視覚化することができません。
何か手助けはありますか?
ありがとう、
Re: 他の列からのパターンに基づいて 2 つの列を生成したいと考えています親愛なる@jthi (ジャーモ) そして親愛なる@txnelson (ジム)、
皆様のご支援とご親切に本当に感謝しています。
これら 2 つの方法のいずれか、またはこれら 2 つの方法を組み合わせた方法で、確実に有効な方法が 1 つ見つかるでしょう。
お二人に改めて感謝申し上げます。
メリークリスマス、そしてハッピーニューイヤー。 あなたの時間を楽しむ。
よろしくお願いします、
ハリー
Re: 他の列からのパターンに基づいて 2 つの列を生成したいと考えていますこれを試してみました。 私は可能な限り Lag() の使用を避け、Col 関数に置き換えるようにしています。 最も難しい式は次のように思われます必須列 1そして、Lag() を使用せずに適切な式をすぐに見つけることはできませんでした (何らかの方法で Col Cumulative Sum を使用した解決策がおそらくあります)。 1 つのアイデアとしては、Start と End の間の場所を「進行中」またはそれに類似したもので埋めることです。そうすれば、Col Cumulative Sum をより簡単に使用できるかもしれませんが、その場合、最も難しい数式はおそらく次のようになります。開始と終了。
もっと見る... 時間があれば、これを解決する両方の方法をテストすることをお勧めします。 @txnelsonは、ラグと比較をより多用して提供しており、私は Col 式を使用しています。 どちらにも必ずそれぞれのユースケースがあり、それらを理解することは、JMP で式や計算を記述するときに長期的に役立ちます。 そして場合によっては、両方を組み合わせる方法を理解すると、数式だけで非常に難しいタスクを解決できることがあります。
また、ロジックが機能するようになったら、おそらくデータテーブルから数式を削除します (または、スクリプト内の Formula() を << Set Each value に置き換えます)。これは、データテーブル内の順序が変更されると壊れる可能性が高いためです。
Re: 他の列からのパターンに基づいて 2 つの列を生成したいと考えていますありがとう@txnelson 、
私はある程度の進歩を遂げ、各セットの開始点と終了点を正確に特定しました。 数式列を見てわかるように、非常に単純なロジックを使用しました。
しかし今、「開始」点と「終了」点の各ペアの間に数字を入れるのに苦労しています。 カウンターを「終了」で停止する際に問題が発生します。 私の問題も同じ複雑さを抱えている可能性がありますが、少なくとも今は開始点と終了点のマーキング/タグをクリアしています。
これに関して何か助けはありますか?
ありがとう。

ありがとう。
Re: 他の列からのパターンに基づいて 2 つの列を生成したいと考えていますこの問題は、JSL 変数「other」に適用されるロジックにあるようです。今日はその問題に取り組む時間がありませんが、明日の午後には調査できるはずです。
Re: 他の列からのパターンに基づいて 2 つの列を生成したいと考えていますこんにちは、ジムさん
混乱させて申し訳ありません。
元の式 (私はそれをめちゃくちゃにしていないと信じています) は、ほとんどのケースで機能しましたが、完全なデータセットでいくつかの間違った点や見逃した点もいくつか捉えていました。 添付されたデータのサブセット (1 つの「ID」と「サブセット」の 1 つの値のみ) には、数式に基づく列があり、間違った点がほとんどありません。
行: 647-649 間違ったエントリ (赤色)
行: 868 ~ 937 はキャプチャされません (赤色)
行: 1307-1311 間違ったエントリ (赤色)
そして、これは、条件を:Occurrenceに設定すると修正されました。
今私が探しているのは -
1. 発生した最後のプライマリ センサー = n (たとえば、n = 2)、「開始」としてマークします。
2. 発生 = n+1 (= 3) の最初のプライマリ センサー。n = 3 にプライマリ センサーがない場合は、発生 = n+2 == 4 で値を停止/マークする必要があります。 「終了」としてマークします
3. 最後に、新しい列の「開始」と「終了」の間に数字を入力します。
別の考え方 (かもしれない) --
単一の出現 n (n = 2) の最初のプライマリ センサーを END としてマークし、最後のプライマリ センサーを Start としてマークし、新しい列に Start と End の間の値を入力できる場合。
これが役に立ち、物事が明確になることを願っています。
ありがとう、
見つけることができれば、これはあり得ると思います
Re: 他の列からのパターンに基づいて 2 つの列を生成したいと考えています私は混乱しています。私が見る限り、私が作成したスクリプトは機能しているようです。ただし、データ テーブルの 44 行目以降でルールが変更され、End が Primary の次の値の前の行に配置されるようになりました。どれが欲しいですか?

Re: 他の列からのパターンに基づいて 2 つの列を生成したいと考えていますこんにちは@txnelson 、 お返事をありがとうございます。
正しい (更新された要件の) 開始点を取得できません。 データ テーブル (「更新されたサンプル データ」) と画像では、修正されたデータ列を手動で入力しました。
式。 以前「必須列 1 古い」と「必須列 2 古い」を取得していましたが、これはこれです(あなたが私にくれたのと同じで、それに発生条件を追加しました) -
RCValue = "";
:Required Column 1[Row()] = .;
If( :Occurrence != Lag( Occurrence, -1 ),
other = "Yes"
);
If( Row() == 1 | :ID != Lag( :ID ) | :"Sub-set"n != Lag( :"Sub-set"n ),
counter = 0;
withinStart = "No";
other = "Yes";
);
If(
:Sensor == "Primary" & :Occurrence == Lag( :Occurrence, -1 ) & Dif( :Occurrence ) == 0 &
withinStart == "Yes",
RCValue = "End";
withinStart = "No";
other = "No";,
:Occurrence != Lag( Occurrence, -1 ) & Lag( :Sensor, -1 ) != "Primary" & withinStart == "No"
& other == "Yes" & Row() != N Rows( Current Data Table() ),
withinStart = "Yes";
counter = counter + 1;
RCValue = "Start";
);
If( withinStart == "Yes" | RCValue == "End",
:Required Column 1[Row()] = counter
);
RCValue;

どうもありがとう。
Re: 他の列からのパターンに基づいて 2 つの列を生成したいと考えています以前に提供したコードを変更して、最新の回答で提供した結果を取得しました。 サンプル データ テーブルに表示されている結果を取得するために使用している JSL を提供してください。
Re: 他の列からのパターンに基づいて 2 つの列を生成したいと考えていますこんにちは@txnelsonそして全員、
私の要件に完全に基づいてコードを変更することができました。 しかし、第 2 段階のトラブルシューティングでは、次のようなものが必要です --
:Occurrence の連続変化付近に :Sensor = "Primary" (1 番目) をマークします。指定されたスクリーンショットでは -
間に必要な値---最後の「プライマリー」で出現数 = 2そしてまずは「プライマリー」で出現数 = 3 【発生状況の連続変化】
最初のプライマリを見つけることはそれほど難しくありませんが、最後のプライマリを見つける方法がわかりません。 Occurrence = 2 のサブセット データを何らかの方法で反転 (降順) しようと考え、値を見つけて元に戻します。 数式が入れられない!! それを行う他の方法はありますか?
何か助けはありますか?
ありがとう。

Re: 他の列からのパターンに基づいて 2 つの列を生成したいと考えていますこんにちは@txnelson 、
誤った入力はほとんどなく、ほぼ機能しました。 :Occurrence 列に追加の条件を追加する必要があると思います。 つまり、:Occurrence は、:Required Column 2 == "Start" を設定するように変更する必要があります (オプションの場合もあります - :Required Column 2 == "End" の場合も同じである必要があります)。
のようなもの - Dif(:Occurrence) !=0 の場合のみ :Required Column 2 == "Start"
私のサンプルデータ(95行)の場合、あなたの数式では問題ありませんでしたが、30万行を超える実際のデータでは、以下のような多くの間違ったエントリが与えられています - (:Occurrenceに関する追加の要件が追加されれば、それは問題ないと思います)。 ) これは、間違ったエントリの 1 回限りのスクリーンショットです。

うまくいけば!!式/コードを変更して、:Occurrence の要件を追加できます。あなたの式の上に。
ご支援に改めて感謝申し上げます。
Re: 他の列からのパターンに基づいて 2 つの列を生成したいと考えていますこれは、必須列 2 を参照する列の式です。コードを調べると、開始値と終了値を決定するときにチェックする必要があると述べた論理ルールを適用しているだけであることがわかります。また、必須列 1 の列の値の設定も含まれています。この数式を実行するには、必須列 1 と必須列 2 を作成するだけです。必須列 2 を文字列に設定します。次に、必須列 2 の式を開き、以下の式をその列にコピーします。

RCValue = "";
:Required Column 1[Row()] = .;
If( :Sensor != "Primary",
other = "Yes"
);
If( Row() == 1 | :ID != Lag( :ID ) | :"Sub-set"n != Lag( :"Sub-set"n ),
counter = 0;
withinStart = "No";
other = "Yes";
);
If(
:Sensor == "Primary" & withinStart == "Yes",
RCValue = "End";
withinStart = "No";
other = "No";,
:Sensor == "Primary" & Lag( :Sensor, -1 ) != "Primary" & withinStart == "No" & other == "Yes" & Row() !=
N Rows( Current Data Table() ),
withinStart = "Yes";
counter = counter + 1;
RCValue = "Start";
);
If( withinStart == "Yes" | RCValue == "End",
:Required Column 1[Row()] = counter
);
RCValue;