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”何时开始。您能提供一个小示例数据集吗?