행 반복 질문안녕하세요,
이전의 모든 답변에 정말 감사드리며 매일 JSL에 대해 점점 더 많이 배우고 있습니다. 이 시점에서 나는 기본 사항에 익숙해졌고 다음 사항에 대해 배웠습니다. 을 위한 루프, 각 행에 대해 그리고 공식 기능. 이것은 매우 도움이 되었습니다. 이전 게시물에서 언급했듯이 저는 데이터 세트를 작업 중이며 4개의 주요 열이 있습니다.
1) PATIENTID : 환자번호의 고유값 목록
2) VALUE: 특정 시점의 환자 평가 값
3) TIME: 환자 평가가 수집된 시점
4) PARAM: 환자 등급은 4개의 개별 항목과 총점(ITEM1, ITEM2, ITEM3, ITEM4 및 TOTAL)으로 구성됩니다. 총점은 단순히 ITEM1+ITEM2+ITEM3+ITEM4의 합계입니다.
여기에서 5번째 열("TEST"라고 함)을 만들고 싶습니다. TEST의 값은 다음 논리를 기반으로 합니다.
개인 환자의 경우, 기준선 값은 다음과 같습니다
- 합계 > 9 또는
- ITEM1, ITEM2, ITEM3 또는 ITEM4 중 1개가 3보다 크거나
- ITEM1, ITEM2, ITEM3 또는 ITEM4 중 3개가 2보다 큽니다.
그런 다음 "TEST"의 해당 행은 "YES"로 평가되어야 합니다. 기준선이 아닌 값과 기타 값은 "NO"로 평가되어야 합니다. 이 논리는 모든 환자와 데이터 테이블의 모든 행에 반복되어야 합니다.
데이터세트의 행을 반복하는 데 문제가 있습니다. 그 이유는 환자마다 척도를 작성한 시점의 수가 다르기 때문입니다. 일부 환자는 조기에 퇴원하기도 했습니다. 환자마다 행 수가 다르기 때문에 행을 반복하여 스크립트를 작성하는 방법을 파악하는 데 어려움을 겪고 있습니다.
일부 IF 문을 결합하려고 시도했지만 다음 환자 ID를 반복해야 하는 지점에서 멈췄습니다. 제가 작성한 스크립트를 첨부합니다만, 막혔습니다. 어떤 도움이라도 대단히 감사하겠습니다.
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", Character, Formula(
If(:TIME == "BASELINE",
theRow = Row();
thePatient = :PATIENTID;
If(:PARAM == "TOTAL",
If(N Rows(dt << Get Rows Where(
Row()>=theRow &
thePatient == :PATIENTID &
:VALUE > 9
)
) > 0
,"YES"
,"NO"
)))
));다음은 데이터 테이블의 예입니다(개인 정보 보호를 위해 수정된 실제 환자 정보).

Re: 행 반복 질문감사합니다. 이제 이해가 되네요. 시간을 내어 설명해 주셔서 감사합니다. 매우 도움이 되었습니다!!
Re: 행 반복 질문@SrihariGopal ,
첫 번째 게시물에서는 수식과 Set Each Value()가 행을 반복하는 방법을 설명했습니다.따라서 명심해야 할 몇 가지 정보는 다음과 같습니다.
- 논리문은 True 또는 False로 평가됩니다. True는 1과 같고 False는 0과 같습니다.
- x가 숫자 값이라고 가정합니다. JSL 함수 If( x, "YES", "NO" )는 x 값을 확인합니다. x > 0이면 결과는 True(1)=>YES 이고, 그렇지 않으면 False(0)=>NO입니다.
- :TIME == "BASELINE"은 1 또는 0을 반환하는 논리 문이므로 "AND"(&)를 사용하는 대신 곱하기 기능이 작동합니다. 즉, TIME은 BASELINE과 동일해야 하며 규칙 중 하나가 참이어야 합니다(예: 1*1 = 1). 둘 중 하나라도 거짓이면 결과는 0 또는 거짓입니다.
- 외부 Maximum() 함수에는 3개의 인수, 즉 3개의 규칙이 있습니다. 이 최대값 기능은 "OR"( | )을 대체합니다. 세 가지 규칙이 모두 거짓인 경우 외부 최대값은 0을 반환합니다. 3가지 규칙 중 하나라도 1(True)을 반환하면 최대값은 1을 반환합니다. 하지만 이 결과에는 논리적 승수가 있으므로 이는 BASELINE 값에만 적용된다는 점을 명심하세요.
- 규칙과 관련하여: 규칙 #1( :TOTAL > 9 )은 1 또는 0을 반환합니다. 규칙 #2는 4개 항목 중 최대값을 찾습니다. 해당 항목이 3보다 크면 적어도 하나의 항목이 3보다 큽니다. 규칙 #3은 4개의 논리적 결과의 합입니다(항목 1 >2 등). 해당 합이 2보다 크면 항목 중 3개 또는 4개가 2보다 큽니다.
논리문에 산술을 사용하면 "k of n" 규칙을 충족하는 사례를 더 쉽고 빠르게 찾을 수 있습니다. 4개의 항목을 연결하고 해당 항목이 { "0111", "1011", "1101", "1110"}에 있는지 확인하거나 숫자로 만들고 해당 값을 찾는 것과 같은 다른 방법이 있습니다.그러나 합계에는 단 한 번의 확인만 필요합니다(>2).규칙 #3에 산술을 사용했기 때문에 OR 대신 수학 함수인 Maximum()을 사용하고 나머지 논리에는 AND 대신 곱셈을 사용했습니다.논리 함수와 수학 함수를 혼합하는 명령문이 있을 수 있습니다.
도움이 되길 바랍니다.
Re: 행 반복 질문매우 감사합니다! 이것은 완벽하게 작동했습니다.
대본을 읽어보고 있는데 좀 더 설명해주실 수 있으신지 궁금합니다. 이 맥락에서 MAXIMUM 함수는 어떻게 작동합니까? 최대 3가지 규칙을 찾고 계시다는 점을 이해합니다. 그러나 * 연산자는 곱셈을 의미한다고 가정합니다. IF 문에서 MAXIMUM 함수와 함께 곱셈이 어떻게 함께 작동하는지 혼란스러웠습니다.
정말 감사합니다!Re: 행 반복 질문@SrihariGopal ,
당신은 당신의 목표가 다음과 같다고 말했습니다.
개인 환자의 경우, 기준선 값은 다음과 같습니다
- 합계 > 9 또는
- ITEM1, ITEM2, ITEM3 또는 ITEM4 중 1개가 3보다 크거나
- ITEM1, ITEM2, ITEM3 또는 ITEM4 중 3개가 2보다 큽니다.
그런 다음 "TEST"의 해당 행은 "YES"로 평가되어야 합니다. 기준선이 아닌 값과 기타 값은 "NO"로 평가되어야 합니다. 이 논리는 모든 환자와 데이터 테이블의 모든 행에 반복되어야 합니다.
누적된 테이블의 복잡한 규칙을 수행할 수 있지만 지저분해집니다. PARAM에 의해 규칙이 적용되는 PATIENTID 및 TIME에 의해 테이블이 스택 해제되면 관리가 훨씬 쉽습니다. 테이블이 매우 큰 경우 이 방법은 효율적이지 않을 수 있습니다.
3가지 규칙을 테스트하기 위한 2개의 추가 PATIENTID가 포함된 예제 테이블이 첨부되어 있습니다.첨부된 스크립트를 사용하기 전에 공식이 3가지 규칙을 적절하게 포착하는지 확인해야 합니다. 확인하기 쉽도록 댓글란과 색상을 추가했습니다.

분할되면 세 가지 규칙 TEST 열의 공식은 다음과 같습니다. 스크립트에는 테이블을 스택 해제하고 재구성하는 JSL 코드도 포함되어 있습니다.
dt_split:TEST << Set Each Value(
If(
(:TIME == "BASELINE") *
Maximum(
:TOTAL > 9, //rule 1
Maximum( :ITEM1, :ITEM2, :ITEM3, :ITEM4 ) > 3, //rule 2
(:ITEM1 > 2) + (:ITEM2 > 2) + (:ITEM3 > 2) + (:ITEM4 > 2) >= 3 //rule 3
),
"YES",
"NO"
));
.