こんにちは、JMP コミュニティです。数千行のテーブルを扱っています。 1 つの列では、特定の行が「イベント」とマークされています (たとえば、特定の日の規格外のロット)。 「イベント」の前の x 行がマーカー PRE で、イベント後の y 行が POST とマークされている新しい列を作成するにはどうすればよいですか。 以下の例では、x=3 および y=5 です。
ご協力ありがとうございました!

追加のロジックと次のJSLを少し調整すると、必要なものが得られると思います
If(
:Name( "Column 1 -Existing" )[Row()] == "Event", "Event",
(:Name( "Column 1 -Existing" )[Row() - 1] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 2] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 3] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 4] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 5] == "Event") &
:Name( "Column 1 -Existing" )[Row()] == "", "POST",
(:Name( "Column 1 -Existing" )[Row() + 1] == "Event" |
:Name( "Column 1 -Existing" )[Row() + 2] == "Event" |
:Name( "Column 1 -Existing" )[Row() + 3] == "Event") &
:Name( "Column 1 -Existing" )[Row()] == "", "PRE"
)
親愛なるジム ( @txnelson ) 、
このソリューションを提供していただきありがとうございます。これはまさに私が求めていたものです。
それをいじってみると、元の質問で 1 つの課題を見落としていることがわかりました。「イベント」が互いに近づきすぎると、ルールの下で以前の結果が上書きされる可能性があります。
次の優先順位付けルールを埋め込むことで、ソリューションをさらに微調整する方法はありますか?
- 第 1 優先度: 「イベント」行。常に新しい列に「イベント」行としてコピーされ、「POST」または「PRE」で上書きできません。
- 2 番目の優先度: 「POST」の結果は「PRE」によって決して上書きされません。
これが本当の強引な方法である式です。列名の一部としてマイナス記号「-」を選択したため、実際よりも複雑に見えますが、コードは列名の周りに :Name() 関数を使用する必要があります。
If(
:Name( "Column 1 -Existing" )[Row() + 1] == "Event" |
:Name( "Column 1 -Existing" )[Row() + 2] == "Event" |
:Name( "Column 1 -Existing" )[Row() + 3] == "Event", "PRE",
:Name( "Column 1 -Existing" )[Row() - 1] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 2] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 3] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 4] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 5] == "Event", "POST",
:Name( "Column 1 -Existing" )[Row()] == "Event", "Event"
)
新しい列が追加されたサンプルデータテーブルが添付されています
これはそれを行う必要があります:
/* Each 'PRE' should start (in this example) 3 rows before the 'Event'-row and
stop 1 row before the 'Event'
Each 'POST' should start 1 row after the event and stop 5 rows after the 'Event'
Thank you! */
dt = New Table( "pre-post example", Add Rows( 23 ),
New Column( "Column 1", Character, "Nominal",
Set Values(
{"", "", "", "", "Event", "", "", "", "", "", "", "", "", "", "", "", "",
"Event", "", "", "", "", ""}
)
),
New Column( "Column 2", Character, "Nominal",
Set Values(
{"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", ""}
)
)
);
event_rows = dt << get rows where(dt:Column 1 == "Event");
nr = nrows(event_rows);
if (nr > 0,
for (i = 1, i <= nr, i++,
start_row = maximum(event_rows[i] - 3, 1); // Keep from trying to set a negative row
for (k = start_row, k < event_rows[i] , k++,
dt:column 2[k] = "PRE";
);
end_row = minimum(event_rows[i] + 5, nrows(dt)); // Prevent setting higher rows than are in the table
for (k = event_rows[i] + 1, k <= end_row, k++,
dt:column 2[k] = "POST";
);
dt:column 2[event_rows[i]] = "Event";
);
);@pmroz添付の簡単な例を見つけてください。
各「PRE」は、(この例では)「イベント」行の 3 行前で開始し、「イベント」行の 1 行前で停止する必要があります。
各「POST」は、イベントの 1 行後に開始し、「イベント」の 5 行後に停止する必要があります
ありがとう!
あなたの例からは、次の「PRE」がいつ開始されるかは明確ではありません。小さなサンプル データセットを提供できますか?