回复:嵌套 If 语句我建议使用 Contains() 而不是长复制粘贴的 or 语句列表和可能的关联数组进行值比较。 如果您需要一个公式,您可能必须使用使用 Eval Insert、Eval Expr、Parse 和 Substitute 将一个表达式插入另一个表达式将列表/关联数组放入公式中。 这可能会给出一些想法:
Names Default To Here(1);
aa_pc_limits = Associative Array();
aa_pc_limits["MIX 1 A"] = {1, 5};
aa_pc_limits["MIX 2 B"] = {3, 4};
aa_pc_limits["MIX 2 C"] = {2, 5};
aa_pc_limits["MIX 2 D"] = {1, 4};
ntc_valid = {"MTX 1 A", "MIX 2 B", "MIX 2C"};
non_pc_valid = {"MTX 1 IC", "MIX 2 IC", "MIX 3 IC"};
dt = New Table("Untitled",
Add Rows(8),
New Column("Sample Name",
Character,
"Nominal",
Set Values({"NTC", "NTC", "AA", "AA", "AA", "PC", "PC", ""})
),
New Column("Target Name",
Character,
"Nominal",
Set Values(
{"MTX 1 A", "MTX AAAA", "MTX 1 IC", "MTX 1 IC", "AAA", "MIX 1 A", "BBB",
""}
)
),
New Column("CT_numeric",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([., ., 2, 5, ., 2, 5, .])
),
New Column("CT",
Character,
"Nominal",
Set Values({"Undetermined", "", "", "", "", "", "", ""})
),
New Column("Run Validity",
Character,
"Nominal",
Set Values({"", "", "", "", "", "", "", ""})
)
);
dt:Run Validity << Set Formula(
If(:Sample Name == "NTC",
If(Contains(ntc_valid, :Target Name),
If(:CT == "Undetermined",
"Pass";
, // else
"Fail";
)
, // else
"NOT DEFINED. NTC"
)
, :Sample Name != "PC",
If(Contains(non_pc_valid, :Target Name),
If((1 < :CT_numeric < 4),
"Pass"
,
"Fail"
)
,
"NOT DEFINED. NON-PC"
)
, :Sample Name == "PC",
If(Contains(aa_pc_limits, :Target Name),
IfMZ(aa_pc_limits[:Target Name][1] < :CT_numeric < aa_pc_limits[:Target Name][2],
"PASS"
,
"FAIL"
)
,
"NOT DEFINED. PC";
)
, //else
"NOT DEFINED";
);
);回复:嵌套 If 语句谢谢你,但我不确定我是否完全遵循它。 在这种情况下,12、13、14 等指的是什么?
谢谢
回复:嵌套 If 语句谢谢,我一直在寻找类似 contains 的东西,但找不到。 并感谢您的嵌套 if 语句,我会试一试。
回复:嵌套 If 语句我猜他们指的是年龄(以及关联数组中的键以执行查找)。
回复:嵌套的 If 语句12、13、14是大班排的年龄。
外部关联数组的 [ 方括号 ] 定义了两个条目,一个用于“M”,一个用于“F”。 这些条目中的每一个也是一个关联数组,其中包含多个按年龄索引的条目。 在底部,您可以看到使用 [sex][age] 查找规则的二维索引。 关联数组还有一个 otherwise 值,可以在键不在数组中时使用。
因此,Lookup["M"] 返回一个包含 12 和 13 条目的 AA; Lookup["M"][12] 返回 80...90 规则,并使用当前行中的权重值对其进行评估以生成字符串。
=>“?”如果存在 F 和 M 以外的值,则需要 =>[=>"?"] 才能实际工作。否则 Lookup["X"] 将不会为第二个索引返回预期的 AA。
回复:嵌套的 If 语句另一种管理复杂规则集的可能方法
dt = open("$sample_data/big class.jmp");
dt<<NEWCOLUMN> [ // rules for females, by age
12 => if(59<HEIGHT><63,"Pass","Fail"),
13 => if(60<HEIGHT><65,"Pass","Fail"),
14 => "Fail",
15 => "Pass",
=> "Maybe" // rule for other ages
],
"M" => [ // rules for males, by age
12 => if(80<WEIGHT><90,"Pass","Fail"),
13 => if(name=="JOHN","Pass","Fail"),
=> "Possibly" // rule for other ages
],
=> [ => "?"] // rule for unknown sex
]);
// use the table, above, to look up a rule, then evaluate the rule
Eval( lookup[:sex][:age] )
));</WEIGHT></HEIGHT></HEIGHT></NEWCOLUMN>
编辑:更改=>“?” to =>[=>"?"] 如下所述。
嵌套 If 语句你好,我在 JSL 中实现嵌套 If 语句时迷失了方向:
dt1:Run Validity <<
Set Formula(
If( (:Sample Name == "NTC" & (:Target Name == "MIX 1 A" | :Target Name == "MIX 2 B" | :Target Name == "MIX 2 C" | :Target Name == "MIX 2 D" | :Target Name == "MIX 3 F" |
:Target Name == "MIX 3 G" | :Target Name == "MIX 3 H" | :Target Name == "MIX 4 I" | :Target Name == "MIX 4 J")), If( (:CT == "Undetermined"), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 1 A"), If( (1 < :CT_numeric < 5), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 2 B"), If( (3 < :CT_numeric < 4), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 2 C"), If( (2 < :CT_numeric < 5), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 2 D"), If( (1 < :CT_numeric < 4), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 3 E"), If( (1 < :CT_numeric < 3), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 3 F"), If( (4 < :CT_numeric < 5), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 3 G"), If( (3 < :CT_numeric < 6), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 4 H"), If( (1 < :CT_numeric < 4), "Pass", "Fail")),
If( (:Sample Name == "PC" & :Target Name == "MIX 4 I"), If( (2 < :CT_numeric < 5), "Pass", "Fail")),
If( (:Sample Name != "PC" & (:Target Name == "MIX 1 IC" |:Target Name == "MIX 2 IC" | :Target Name == "MIX 3 IC" | :Target Name == "MIX 4 IC")), If((1 < :CT_numeric < 4), "Pass", "Fail"))
);
本质上,我想要样本名称 = NTC 且目标名称为 Mix 1 A、Mix 1 B 之一的行...如果 CT 未确定,则返回通过,如果没有失败
有没有更好的方法来使用 if 语句来做到这一点? 或者你能指出我错在哪里吗?
谢谢
高级统计建模自动化和脚本编写消费者和市场研究