回复:嵌套 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 語句來做到這一點? 或者你能指出我錯在哪裡嗎?
謝謝
高級統計建模自動化和腳本編寫消費者和市場研究