[JSL] "복잡한" 조건을 사용하여 행 선택안녕하세요 여러분,
"복잡한" 조건이 있는 테이블의 행을 선택하기 위한 JSL 스크립트를 작성하고 싶습니다.
우선 순위에 따라 조건을 지정하여 메트릭당 하나의 행(열: 메트릭)을 선택해야 합니다.
1- 조건 Flag1 = “FLAG” AND Flag2 = “FLAG”가 존재하는 경우, 이 조건의 Col Max (:Metric1)를 선택합니다.
2- 조건 Flag1 = “FLAG” XOR Flag2 = “FLAG”가 존재하는 경우, 이 조건의 Col Max (:Metric1)를 선택합니다.
3- 그렇지 않은 경우, 행 Max(Metric1)를 선택합니다.
아래에는 For Each Row()와 디버그 열을 사용한 시험적인 코드가 있지만, 제 시도는 효과가 없고 그다지 우아하지 않습니다.
또한, 기본 게이트를 조합하지 않고 JLS에서 XOR(배타적 논리합)을 수행하는 방법을 모르겠습니다.
더 나은 방법이 있을까요?
참고: 내 요청을 설명하는 PNG 파일을 첨부했습니다.
감사해요
- 설교자
Names Default To Here(1);
dt = New Table("RawData",
Add Rows(27),
Compress File When Saved(1),
New Column("Metric",
Character,
"Nominal",
Set Values(
{"A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D", "D", "D"}
)
),
New Column("Flag1",
Character,
"Nominal",
Set Values(
{"FLAG", "OK", "FLAG", "OK", "OK", "OK", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "FLAG",
"FLAG", "OK", "OK", "OK", "FLAG", "OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column("Flag2",
Character,
"Nominal",
Set Values(
{"OK", "OK", "OK", "OK", "OK", "FLAG", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "OK",
"OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column("metric1",
Numeric,
"Continuous",
Format("Best", 10),
Set Values([1, 2, 3, 5, 7, 10, 13, 2, 4, 5, 6, 8, 11, 1, 2, 4, 5, 5, 9, 12, 1, 2, 4, 5, 5, 9, 18])
)
);
//This attempt doesn't select the right rows
debugcol = dt << New Column("Debug", Numeric, Continuous);
For Each Row(dt,
FLAG_row =
If(
:Flag1 == "FLAG" & :Flag2 == "FLAG",
Col Max(:metric1, :Metric),
IF(
:Flag1 == "FLAG" | :Flag2 == "FLAG",
Col Max(:metric1, :Metric),
If(
:Flag1 == "OK" & :Flag2 == "OK",
Col Max(:metric1, :Metric)
)));
debugcol[Row()] = FLAG_row;
);
dt << select where (:metric1 == :Debug);

기본 데이터 분석 및 모델링Re: [JSL] "복잡한" 조건을 사용하여 행 선택내가 이것을 하는 방법은 다음과 같습니다.

Names Default To Here( 1 );
dt = New Table( "RawData",
Add Rows( 27 ),
Compress File When Saved( 1 ),
New Column( "Metric",
Character,
"Nominal",
Set Values(
{"A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "D", "D",
"D", "D", "D", "D", "D"}
)
),
New Column( "Flag1",
Character,
"Nominal",
Set Values(
{"FLAG", "OK", "FLAG", "OK", "OK", "OK", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "FLAG", "FLAG",
"OK", "OK", "OK", "FLAG", "OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column( "Flag2",
Character,
"Nominal",
Set Values(
{"OK", "OK", "OK", "OK", "OK", "FLAG", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "OK", "OK", "OK",
"OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column( "metric1",
Numeric,
"Continuous",
Format( "Best", 10 ),
Set Values( [1, 2, 3, 5, 7, 10, 13, 2, 4, 5, 6, 8, 11, 1, 2, 4, 5, 5, 9, 12, 1, 2, 4, 5, 5, 9, 12] )
)
);
dt << clear select;
rowsToSelect = {};
groups = associative array(:metric<<GET values=""> 0,
Insert Into( rowsToSelect, Max( theRows ) ),
theRows = dt << get rows where( :metric == group & (:Flag1 == "FLAG" | :Flag2 == "FLAG") );
If( N Rows( theRows ) > 0,
Insert Into( rowsToSelect, Max( theRows ) ),
Insert Into( rowsToSelect, Max( dt << get rows where( :metric == group ) ) )
);
);
);
dt << select rows( rowsToSelect );</GET>Re: [JSL] "복잡한" 조건을 사용하여 행 선택추가 열 없이도 할 수 있지만 열이 있으면 더 쉬울 수 있습니다.
Names Default To Here(1);
dt = New Table("RawData",
Add Rows(27),
Compress File When Saved(1),
New Column("Metric",
Character,
"Nominal",
Set Values(
{"A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D", "D", "D"}
)
),
New Column("Flag1",
Character,
"Nominal",
Set Values(
{"FLAG", "OK", "FLAG", "OK", "OK", "OK", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "FLAG", "FLAG", "OK", "OK", "OK", "FLAG",
"OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column("Flag2",
Character,
"Nominal",
Set Values(
{"OK", "OK", "OK", "OK", "OK", "FLAG", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK",
"OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column("metric1",
Numeric,
"Continuous",
Format("Best", 10),
Set Values([1, 2, 3, 5, 7, 10, 13, 2, 4, 5, 6, 8, 11, 1, 2, 4, 5, 5, 9, 12, 1, 2, 4, 5, 5, 9, 18])
)
);
typecol = dt << New Column("ROWTYPE", Numeric, Continuous, Formula(
If(:Flag1 == "FLAG" & :Flag2 == "FLAG",
2
, :Flag1 == "OK" & :Flag2 == "OK",
0
,
1
);
));
dt << Select Where(
:metric1 == Col Max(
If(:ROWTYPE == Col Max(:ROWTYPE, :Metric),
:metric1
,
.
),
:Metric
);
);
dt << Delete Columns(typecol);
wait(0);
이 솔루션의 한 가지 문제점은 Col 통계 함수에서 열 참조 외에는 다른 것을 사용해서는 안 되기 때문에 다가올 JMP 버전에서 깨질 수 있다는 것입니다. JMP가 현재 이러한 함수가 가지고 있는 가장 유용한 "기능" 중 하나를 깨지 않기를 바라는 소원 목록 항목입니다.
Set Each Value에서 수식 표현식을 사용하고 Col 통계 수식에서 첫 번째 인수로 표현식을 사용하여 지원되는 동작을 만듭니다 (이러한 함수를 점점 덜 사용하려고 하지만 현재 이 함수들이 너무 강력하고 다른 옵션보다 더 쉽고 빠르며 읽기 쉬운 스크립트를 만들기 때문에 어렵습니다).
Re: [JSL] "복잡한" 조건을 사용하여 행 선택안녕하세요 짐,
답변 감사합니다.
정말 죄송합니다. 제 요청이 명확하지 않았던 것 같습니다.
각 메트릭 내의 행 그룹을 우선 순위 지정한 후(스크립트와 잘 맞는 방식)
현재 스크립트와 같이 Max (theRows)를 기준으로 하지 않고, 가장 높은 값(열: metric1)의 행을 선택해야 합니다.
이전에 제가 제공한 더미 테이블은 각 그룹 내의 "Col Max (:metric1)"가 항상 "Max (theRows)"와 동일하기 때문에 혼란을 더했습니다.
제안하신 스크립트는 새로운 값 집합에서는 더 이상 작동하지 않습니다. 아래에서 :metric1을 :Value로 바꿔서 열 이름의 모호성을 제거하고 숫자 값을 다시 섞었습니다.
"get rows where()" 내부에 규칙으로 추가된 "Col Max()"를 가지고 실험해 보았지만 성공하지 못했습니다.
(제 영어가 완벽하지 않다는 걸 알고 있으므로 제 표현이 정확하지 않다면 제 목표를 설명하는 이미지를 추가했습니다.)
제안하실 말씀 있으신가요?
다시 한번 감사드립니다
설교자
Names Default To Here( 1 );
dt = New Table( "RawData",
Add Rows( 27 ),
Compress File When Saved( 1 ),
New Column( "Metric",
Character,
"Nominal",
Set Values(
{"A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "D", "D",
"D", "D", "D", "D", "D"}
)
),
New Column( "Flag1",
Character,
"Nominal",
Set Values(
{"FLAG", "OK", "FLAG", "OK", "OK", "OK", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "FLAG", "FLAG",
"OK", "OK", "OK", "FLAG", "OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column( "Flag2",
Character,
"Nominal",
Set Values(
{"OK", "OK", "OK", "OK", "OK", "FLAG", "OK", "FLAG", "FLAG", "FLAG", "OK", "FLAG", "OK", "OK", "OK", "OK", "OK",
"OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column( "Value",
Numeric,
"Continuous",
Format( "Best", 10 ),
Set Values( [1, 2, 9, 5, 13, 2, 7, 9, 4, 11, 6, 8, 3, 1, 2, 13, 5, 5, 9, 12, 1, 2, 4, 5, 5, 9, 7] )
)
);
dt << clear select;
rowsToSelect = {};
groups = associative array(:metric<<GET values=""> 0,
Insert Into( rowsToSelect, Max( theRows ) ),
theRows = dt << get rows where( :metric == group & (:Flag1 == "FLAG" | :Flag2 == "FLAG") /*& :Value == Col Max (:Value, :Metric, :Flag1, :Flag2)*/ );
show (theRows);
If( N Rows( theRows ) > 0,
Insert Into( rowsToSelect, Max( theRows ) ),
Insert Into( rowsToSelect, Max( dt << get rows where( :metric == group /*& :Value == Col Max (:Value, :Metric, :Flag1, :Flag2)*/) ) );
show (theRows);
);
);
);
dt << select rows( rowsToSelect );</GET>
Re: [JSL] "복잡한" 조건을 사용하여 행 선택자르모,
정말 감사합니다,
제안하신 솔루션은 내 기본 스크립트에서 작동합니다!
JMP의 이후 버전에서 Col 함수 배열이 깨질 수 있다고 언급하셨는데요.
저희 회사에서는 매년 JMP 버전을 최신 릴리스로 업그레이드하고 있습니다.
일단은 귀하의 스크립트를 사용하고, Jim(txnelson)의 도움을 받아 그의 제안이 적용되도록 하여 내 코드가 더욱 강력해지도록 노력하겠습니다.
다시 한번 감사드립니다!!
설교자
Re: [JSL] "복잡한" 조건을 사용하여 행 선택JMP가 동작을 변경할지 여부는 알 수 없습니다. JMP는 이를 의도하지 않은 동작으로 간주합니다. 즉, 정보 없이도 언제든지 변경될 수 있다는 의미입니다. 아직 변경하지 않았다면 위시리스트 항목에 찬사를 보내 의도하지 않은 동작이 아닌 기능으로 변경하세요( Set Each Value에서 수식 표현식을 사용하고 Col 통계 수식에서 첫 번째 인수로 표현식을 사용하는 지원되는 동작 )
Re: [JSL] "복잡한" 조건을 사용하여 행 선택나는 방금 그랬어요,
감사해요:)