JSL 將“And”條件新增至資料過濾器你好 JMP 社區
我想知道是否有一種方法可以在 JSL 中的資料過濾器中添加“and”條件。
作為一個例子,我做了一個資料集

如果我們只根據平均值建立一個簡單的模型,
model = Fit Model( Y( :Data ), Run);
我們可以使用資料過濾器將模型限制為一組
dtf = model << Local Data Filter(Columns(:Group), where(:Group == "A"));

但是現在,如果我想添加另一個過濾器,我能找到的唯一 JSL 選項(“添加過濾器”、“過濾器列”等)似乎僅作為“或”條件添加。
dtf << Add Filter(columns(:Outlier), where(:outlier == 0));
dtf << Filter Columns(:Outlier);

唯一的選擇似乎是刪除資料過濾器,然後添加包含所有條件的新過濾器
model << Remove Local Data Filter;
dtf = model << Local Data Filter(Columns(:Group, :Outlier), where(:Group == "A"), where(Outlier == 0));

我是否缺少添加“And”條件的方法,或者這是不可能的。
br。
卡斯帕·施洛瑟
自動化和腳本編寫回覆:JSL 將“And”條件加入到資料過濾器在 JMP 中建立篩選器並複製腳本
Fit Model(
Y(:Data),
Effects,
Personality("Standard Least Squares"),
Emphasis("Effect Leverage"),
Run(
:Data << {Summary of Fit(1), Analysis of Variance(1), Parameter Estimates(1),
Lack of Fit(0), Plot Actual by Predicted(1), Plot Regression(0),
Plot Residual by Predicted(1), Plot Studentized Residuals(0),
Plot Effect Leverage(1), Plot Residual by Normal Quantiles(0),
Box Cox Y Transformation(0)}
),
Local Data Filter(
Add Filter(
columns(:Group, :Outlier),
Where(:Group == "A"),
Where(:Outlier == 1)
)
)
);
這通常可以讓您了解接下來可以編寫哪些內容
dt = Current Data Table();
model = Fit Model(Y(:Data), Run);
dtf = model << Local Data Filter(
Columns(:Group, :Outlier),
Where(:Group == "A"),
Where(:Outlier == 1)
);
回覆:JSL 將“And”條件新增至資料過濾器是的,或者腳本索引還概述了資料過濾器接受的訊息(儘管並非總是全部)。
這兩個似乎都表明不,沒有辦法通過jsl向數據過濾器添加“and”條件。
這意味著在 jsl 中添加“and”條件的唯一方法是提取過濾器程式碼,更改程式碼,然後解析和評估。這是混亂且容易出錯的。
回覆:JSL 將“And”條件新增至資料過濾器請務必將此暴露的限制添加到 JMP 願望清單中。
另外,我想我對你提到的解析和評估有不同的看法。讓我感到安慰的是,如果我遇到限制,JMP 會提供這種基本等級的功能,大多數情況下可以為我提供解決方案。
回覆:JSL 將“And”條件加入到資料過濾器當您向篩選器新增列時,您基本上是在建立新的篩選群組,並且預設情況下這些群組是 OR 分隔的。根據用例,有時您可能可以使用 Grouped by And
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Cities.jmp");
obj = dt << Data Filter(
Add Filter(columns(:Region, :POP), Where(:Region == {"C", "N"})),
Mode(Select(0), Show(0), Include(1))
);
obj << Add Filter Columns(:State);
obj << Grouped by AND(1);
在使用者介面上,當您按 AND 時,我們可以新增到選定的群組,但我們沒有簡單的腳本選項。
回覆:JSL 將“And”條件加入到資料過濾器
@jthi寫道:
但我們沒有簡單的腳本選項。
我認為我們確實有:
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
gb = dt << Graph builder();
dtf = gb << Local Data Filter(
Columns(:sex),
Where(:sex == "F")
);
dtf << (Filter Column(:age) << Where(:age == 14));
回覆:JSL 將“And”條件新增至資料過濾器這似乎有效
快速測試表明,該方法會影響第一個過濾器。 IE。如果我們有 2 個「或」條件,我們只能影響第一個。
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
gb = dt << Graph builder();
dtf = gb << Local Data Filter(
Columns(:sex),
Where(:sex == "F")
);
// adds or condition
dtf << Add Filter(Columns(:sex), Where(:sex == "M"))
// Only affects the female filter
dtf << (Filter Column(:age) << Where(:age == 14));
但對於我的用例來說,這是完美的。
回覆:JSL 將“And”條件新增至資料過濾器不錯的發現!
這似乎僅當您也使用過濾器列發送 where 訊息時才有效。這可能是無意的/錯誤或其他什麼,但我們很幸運我們擁有它(它可能會在 JMP 更新時破壞任何給定時間)。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Cities.jmp");
obj = dt << Data Filter(
Add Filter(
columns(:Region, :POP),
Where(:Region == {"C", "N"})
),
Mode(Select(0), Show(0), Include(1))
);
obj << Filter Column(:State); // creates OR group
obj << (Filter Column(:State) << Where()); // Adds AND filter to first filter group
obj << (Filter Column(:CO) << Where()); // Adds AND filter to first filter group
如果我們能夠以某種方式在現有組中添加 AND 過濾器,而不僅僅是新的過濾器 OR 組,那麼很可能會好得多。
@Craige_Hales知道為什麼會發生這種情況/知道從 JMP 這邊標記誰嗎?
回覆:JSL 將“And”條件加入到資料過濾器正如@jthi之前指出的,過濾器由“組”和“項目”組成,並且過濾器組不會作為可編寫腳本的對象直接暴露給 JSL。語法df << (Filter Column(:col) << Msg())是將訊息「轉送」到群組的原始方法,儘管沒有詳細記錄。我將指出,此語法與簡單訊息 df << Filter Column(:col) 的路徑非常不同,後者記錄在腳本索引中。前一種語法沒有內建的 JSL 處理規則,儘管它在其他物件(如 Bivariate)中以類似的方式使用。本質上,發送到過濾器的訊息是一個表達式,支援的語法是過濾器自訂的。
更多關於轉發訊息的特殊語法。有一個可選的第二個參數來指定應接收訊息的過濾器組的索引。當您有多個組(甚至可能包含相同的列)時,這一點可能很重要。如果沒有這個,命令將被發送到第一個匹配列,或添加到第一個群組。
您可能也會發現,傳送到篩選項目的Msg()只能是一條簡單的訊息。這裡的處理不支援發送待處理命令清單。這又是由於內部<<是自訂執行,而不是直接使用核心 JSL 規則。
dt = Open( "$SAMPLE_DATA/Cities.jmp" );
df = dt << Data Filter(
Location( {1001, 218} ),
Add Filter( columns( :POP ), Where( :POP >= 4461 ) ),
Add Filter( columns( :OZONE ), Where( :OZONE <= 0.12581 ) )
);
// add a filter item to the first group
df << (Filter Column(:Region, 1) << Check Box Display);
// add a filter item to the second group
df << (Filter Column(:NO, 2) << Where(:NO <= 0.05));