[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);

基礎資料分析與建模回覆:[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>回覆:[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);
此解決方案的一個問題是,它可能會在任何即將推出的 JMP 版本中出現問題,因為除了 Col 統計函數的列引用之外,您不應該使用任何其他內容。這是一個願望清單項,希望 JMP 不會破壞這些函數目前擁有的最有用的「功能」之一
使在「設定每個值」中使用公式表達式以及在 Col 統計公式中使用表達式作為第一個參數支援行為(我嘗試越來越少使用這些函數,但這很困難,因為它們目前非常強大,而且它們確實創建了更容易、更快、更容易的功能)比其他選項更能讀取腳本)。
回覆:[JSL]使用「複雜」條件選擇行嗨吉姆,
謝謝你的回复,
非常抱歉,我意識到我的要求不是很清楚。
對每個指標中的行組進行優先排序後(這與您的腳本配合得很好),
我需要選擇最高值的行(Column :metric1),而不是像目前腳本中那樣基於Max ( theRows )。
我之前提供的虛擬表增加了混亂,因為每個群組中的“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>
回覆:[JSL]使用「複雜」條件選擇行雅爾莫,
多謝,
您提出的解決方案正在我的主腳本中運行!
儘管您提到 JMP 的未來版本可能會打破這種 Col 函數排列。
我們公司每年都會將 JMP 版本升級到最新版本。
我現在將使用您的腳本,並嘗試獲得吉姆的幫助(txnelson)以使他的建議發揮作用,以便我的程式碼將更加健壯。
再次感謝!
牧師
回覆:[JSL]使用「複雜」條件選擇行我們不知道 JMP 是否會改變行為。 JMP 認為這是意外行為,這意味著它可能會在沒有任何資訊的情況下隨時更改。如果您尚未將其變更為功能而不是意外行為,請對願望清單項目表示讚賞( 在「設定每個值」中使用公式表達式並在Col 統計公式支援的行為中使用表達式作為第一個參數)
回覆:[JSL]使用「複雜」條件選擇行我剛剛做了,
謝謝:)