關於循環的簡單問題你好,
我是 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"
)
)
)
;任何幫助表示讚賞