JMP 社區您好,我正在處理一個包含數千行的表。 在一列中,某些行被標記為“事件”(例如,某一天的不合格批次)。 如何創建一個新列,其中“事件”之前的 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"
)
親愛的吉姆( @特克斯尼爾森),
感謝您提供這個解決方案,它完全滿足了我的要求。
通過研究,我發現我忽略了最初問題中的一個挑戰:當“事件”彼此之間太接近時,下面的規則可能會覆蓋以前的結果。
有沒有辦法通過嵌入以下優先級規則來進一步微調您的解決方案:
- 第一優先級:“事件”行,始終作為“事件”行複製到新列中,並且不能被“POST”或“PRE”覆蓋;
- 第二優先級:“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”應在“Event”行之前的 3 行開始(在本示例中),並在“Event”之前的 1 行停止
每個“POST”應在“事件”後 1 行開始,並在“事件”後 5 行停止
謝謝你!
從您的示例中不清楚下一個“PRE”何時開始。您能提供一個小示例數據集嗎?