我需要根据 if/then 语句的结果填充新列您好 - 我正在尝试根据 if/then 语句的结果创建和填充一组新列。
步骤1:
我需要创建将填充的新空列。(共55个)
(每个新列都是一个数字连续字段。)
每列的名称将对应于该组中 55 个化合物中每个化合物的名称,后跟“_ppt”。例如,名为“4:2 FTS”的化合物会生成名为 [4:2 FTS_ppt] 的新列。
第2步:
我将使用 if/then 语句逐行填充新列,该语句评估与组中 55 种化合物中的每一种关联的三个现有列。具体来说,
如果 [RES_VALUE_4:2 FTS] >= [RL_4:2 FTS] 那么 [4:2 FTS_ppt] = [RES_VALUE_4:2 FTS]
如果 [RES_VALUE_4:2 FTS] < [RL_4:2 FTS] 并且 DETECT_FLAG_4:2 FTS] = N 并且 [RL_4:2 FTS] <= 3 那么 [4:2 FTS_ppt] = 0.0009。
如果 [RES_VALUE_4:2 FTS] < [RL_4:2 FTS] AND DETECT_FLAG_4:2 FTS] = N AND [RL_4:2 FTS] > 3 那么 [4:2 FTS_ppt] = NULL。
以下是带有复合名称后缀的现有列名称。我使用的是 JMP Pro 17.0。



任何指导将不胜感激!
自动化和脚本编写内容组织回复:我需要根据 if/then 语句的结果填充新列- 讨论社区的目的不是成为 JMP 用户根据其请求编写脚本的来源。它可以帮助用户学习 JMP。
- 鉴于您提供的伪代码,显然您需要花时间阅读《JMP 脚本指南》。它位于 JMP 帮助下拉菜单下的 JMP 文档库中。
- 以下是尝试帮助您解决问题的尝试。它没有经过测试,因为我没有你的任何数据。请花时间研究和学习代码。这些函数在脚本索引和 JSL 脚本参考中都有详细记录。
Names Default To Here( 1 );
groupList = {"RES_VALUE", "RES_TEXT", "DETECT_FLAG", "RL", "DILUTION_FACTOR"};
dt = Current Data Table();
// Find all of the different compounds. This is done by using the "RES_VALUE" columns
// and stripping off the compound names from each of them
compList = {};
For( i = 1, i <= N Cols( dt ), i++,
colName = Column( dt, i ) << get name;
If( Contains( colName, "RES_VALUE" ) == 1,
Insert Into( compList, Substr( colName, 11 ) )
);
);
// Create the columns
For Each( {comp, i}, compList,
Eval(
Parse(
"dt << New Column( \!"" || compList[i] || "_ppt" || "\!",
numeric,
continuous,
formula(
If( :\!"RES_VALUE "
|| comp || "\!"n >= :\!"RL " || comp || "\!"n,
x = :\!"RES_VALUE " || comp ||
"\!"n
);
If(
:\!"RES_VALUE " || comp ||
"\!"n < :\!"RL " || comp || "\!"n & :\!"DETECT_FLAG " || comp || "\!"n == \!"N\!" &
:\!"RL " || comp ||
"\!"n <= 3,
x = 0.0009
);
If(
:\!"RES_VALUE "
|| comp || "\!"n < :\!"RL " || comp || "\!"n & :\!"DETECT_FLAG " || comp || "\!"n == \!"N\!" &
:\!"RL "
|| comp || "\!"n > 3,
x = .
);
x;
)
);"
)
)
);
回复:我需要根据 if/then 语句的结果填充新列谢谢吉姆。是的,这一点很好。在投入工作之前,我需要花更多时间了解 jsl 的基础知识。
上面的代码正确创建了所有列,但公式仅生成空值(“.”)。我无法解决该错误,但会继续尝试。再次感谢。
回复:我需要根据 if/then 语句的结果填充新列如果您能提供一些样本数据,我会看一下。
回复:我需要根据 if/then 语句的结果填充新列谢谢吉姆。我附上了下面的 jmp 表,其中包含数据集中的一小部分行。
回复:我需要根据 if/then 语句的结果填充新列有两件事需要改变。
- 公式中使用的变量 x 的值需要为每行执行进行初始化。
- 公式执行需要取消抑制。
Names Default To Here( 1 );
groupList = {"RES_VALUE", "RES_TEXT", "DETECT_FLAG", "RL", "DILUTION_FACTOR"};
dt = Current Data Table();
// Find all of the different compounds. This is done by using the "RES_VALUE" columns
// and stripping off the compound names from each of them
compList = {};
For( i = 1, i <= N Cols( dt ), i++,
colName = Column( dt, i ) << get name;
If( Contains( colName, "RES_VALUE" ) == 1,
Insert Into( compList, Substr( colName, 11 ) )
);
);
// Create the columns
For Each( {comp, i}, compList,
Eval(
Parse(
"dt << New Column( \!"" || compList[i] || "_ppt" ||
"\!",
numeric,
continuous, formula(
x=.;
If( :\!"RES_VALUE "
|| comp || "\!"n >= :\!"RL " || comp || "\!"n,
x = :\!"RES_VALUE " || comp ||
"\!"n
);
If(
:\!"RES_VALUE " ||
comp || "\!"n < :\!"RL " || comp || "\!"n & :\!"DETECT_FLAG " || comp || "\!"n == \!"N\!" &
:\!"RL "
|| comp || "\!"n <= 3,
x = 0.0009
);
If(
:\!"RES_VALUE "
|| comp || "\!"n < :\!"RL " || comp || "\!"n & :\!"DETECT_FLAG " || comp || "\!"n == \!"N\!" &
:\!"RL "
|| comp || "\!"n > 3,
x = .
);
x;
)
);"
)
)
);
dt << Suppress Formula Eval( 0 );
回复:我需要根据 if/then 语句的结果填充新列谢谢吉姆。我本想在你回复后不久再回来,但一直在尝试调试代码。由于某种原因我还没有让它工作。我使用调试器并收到以下消息:

只是想让你知道我收到了你的意见 - 我会继续努力。谢谢。
回复:我需要根据 if/then 语句的结果填充新列
回复:我需要根据 if/then 语句的结果填充新列是的!我刚刚让它工作。再次感谢您对此的帮助!