关于循环的简单问题你好,
我是 JMP 的长期用户,但最近才开始学习脚本。 我正在努力学习基础知识,我想要掌握的关键事情之一是 for 循环的使用。
所以我创建了一个包含 4 列的示例数据集:
1) PATIENTID:患者编号的唯一值列表
2) VALUE:特定时间点患者评分的值
3) 时间:收集患者评分的时间点
4)PARAM:患者评分分为4项和总分
我编写了一个脚本来迭代该数据表中的所有行并评估两个不同变量(:TIME 和:VALUE)的值。 如果满足条件,我想向新列中的行添加一个字符值,该值是“是”或“否”。
这是我写的脚本。 JMP 为新列中的每一行返回空值:
Names Default To Here( 1 );
dt = current data table ();
tr = N Rows (dt);
dt << New Column ("TEST", "CHARACTER",
For (i = 1, i <= tr, i++,
If(
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
)
)
;这是一个简单的脚本,一旦我理解了机制,就想添加更多条件。 但我被困在这一点上,因为脚本无法正常工作。
我还尝试使用 For Each Row 函数编写此脚本,但仍然遇到同样的问题。
对我做错了什么有什么建议吗? 抱歉,如果这是一个简单的答案,我查看了文档,似乎无法弄清楚我做错了什么。
回复:关于循环的简单问题循环通常用于迭代表行或列表中的项目,因此最常见的是递增 1。 但是,第三个参数不能是 i++。 它可以是任何有意义的东西。
举几个例子:
For(i = 1, i <= 10, i = i + 0.1, Expr()); // Increment < 1 (100 iterations)
For(i = 10, i > 1, i--, Expr()); // Loop "backwards"
For(x = 2, x <= 10, x = 2, Expr()); // Eternal loop (better avoid these)
回复:关于循环的简单问题它不起作用,因为循环放置在新列定义内。 创建列并在单独的语句中填充其值,或者使用列公式。
看一下这三个 jsl 示例,它们应该给出相同的结果:
Names Default To Here(1);
dt = Current Data Table();
tr = N Rows(dt);
//1. Fill values with a For() loop
dt << New Column("TEST", "CHARACTER");
For(i = 1, i <= tr, i++,
:TEST[i] = If(:TIME[i] == "BASELINE" & :VALUE[i] > 3,
"YES",
"NO"
)
);
//2. Fill with For Each Row()
dt << New Column("TEST2", "CHARACTER");
For Each Row(:TEST2 = If(:TIME == "BASELINE" & :VALUE > 3, "YES", "NO"));
//3. Use a column formula in TEST3
dt << New Column("TEST3",
"CHARACTER",
Formula(If(:TIME == "BASELINE" & :VALUE > 3, "YES", "NO"))
);
回复:关于循环的简单问题您想要执行的任务可以通过两种方式完成:
a) 对列使用 Formula 属性:
Names Default To Here( 1 );
dt = current data table ();
tr = N Rows (dt);
dt << New Column ("TEST", "CHARACTER",
Formula(
If(
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
)
)
;b) 用循环迭代
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", "CHARACTER", Character, Nominal);
for(ii=1, ii<=N Rows(dt), ii++,
:test[ii]=If(
(:TIME[ii] == "BASELINE" & :VALUE[ii] > 3)
,"YES"
,"NO"
)
);您还可以使用 For Each Row()
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", "CHARACTER", Character, Nominal);
for each row(
:test=If(
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
);
回复:关于循环的简单问题还有一个问题:
JSL 文档说 for 循环是使用 For 函数中的第三个参数递增的。 我见过这通常写成 i++。 我认为这意味着将 i 加 1。 但是如果我想增加小于 1 的值该怎么办? 我该如何写论证?
JSL 文档和脚本索引工具没有提及如何执行此操作。
谢谢回复:关于循环的简单问题这是我为完成相同任务而编写的类似脚本,但使用的是对于每一行功能。 这也行不通。
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", "CHARACTER",
For Each Row (dt,
If (
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
)
)
;任何帮助表示赞赏