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"
)
친애하는 짐( @tx넬슨 ) ,
제가 요청한 것과 정확히 일치하는 이 솔루션을 제공해 주셔서 감사합니다.
그것을 가지고 놀면서 나는 원래 질문에서 한 가지 문제를 간과했다는 것을 배웠습니다. '이벤트'가 서로 너무 가까워지면 아래 규칙이 이전 결과를 덮어쓸 수 있습니다.
다음 우선 순위 규칙을 포함하여 솔루션을 더욱 미세 조정할 수 있는 방법이 있습니까?
- 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'는 (이 예에서) 'Event' 행 이전 3행에서 시작하고 'Event' 이전 행 1에서 중지해야 합니다.
각 'POST'는 이벤트 이후 1행에서 시작하고 '이벤트' 이후 5행에서 중지해야 합니다.
고맙습니다!
다음 "PRE"가 언제 시작되어야 하는지는 귀하의 예에서 명확하지 않습니다.작은 예제 데이터 세트를 제공할 수 있습니까?