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 分隔。根据用例,有时您可能能够使用按 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);
在 UI 上,当您按下“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”条件这似乎有效
快速测试表明,此方法影响第一个过滤器。即,如果我们有 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));