如何根據其他兩個列的值創建新列?你好:
我是 JMP 的長期用戶,剛剛開始深入研究腳本編寫和公式編輯器的使用。 我有一個大表(大約 10K 行)。 我有幾個感興趣的專欄:
- Patient_ID:每個患者的唯一標識符
- 時間:收集實驗室樣本的時間點
- LAB_VALUE:具有 3 種離散可能性的實驗室參數值(正常、輕度、嚴重)
- SEX:患者的性別
我想根據以下內容創建一個名為“STATUS”的新列:
- 如果 Lab_Value 的基線值 = 正常,並且至少有一個基線後值為 MILD 或 SEVERE,則在 STATUS 列中標記為“1”
- 如果 Lab_Value 的基線值 = 輕度,且至少有一個基線後值為嚴重,則在狀態列中標記為“2”
- 如果 Lab_Value 的基線值 = 嚴重,並且至少一個基線後值為 MILD 或 NORMAL,則在 STATUS 列中標記為“3”
這變得有點複雜,因為有些患者在完成所有實驗室之前就退出了。 有些患者在終點(第 372 天)之前都有數據,而其他患者則沒有。 所以寫劇本很困難。您能幫忙告訴我該怎麼做嗎? 我嘗試使用公式功能創建一堆 if 語句,但無法使其工作。 任何幫助,將不勝感激。
非常感謝
回复:如何根據其他兩個列的值創建新列?親愛的吉姆:
謝謝,這非常有幫助。 我對你感激不盡。 你的劇本對我有用。
我花了最後一天的時間試圖弄清楚如何附加到你的腳本中。 我特別想為 LAB_VALUE 創建第四個類別。 如果患者的實驗室值狀態不滿足以下 3 個條件中的任何一個,那麼我想將其標記為第四類“4”。
我嘗試在最後一個 if 語句中添加“,4)”,但它不起作用。 腳本編輯器一直抱怨缺少 , 或 )。 或者它不會評估某些行。 您能提供的任何幫助將不勝感激。
@tx尼爾森寫道:
這是設置 STATUS 值的一種方法。這不是非常有效的代碼,但它應該可以工作。我無法完全測試它,但邏輯非常簡單。
dt = current data table();
dt << New Column( "STATUS", formula(
If( :TIME == "BASELINE",
theRow = Row();
thePatient_ID = :PATIENT_ID;
If(:LAB_VALUE == "NORMAL",
If( N Rows( dt << get rows where(
Row()>theRow &
thePatient_ID == :PATIENT_ID &
(:LAB_VALUE == "MILD" | :LAB_VALUE == "SEVERE")
)
) > 0
,
1,
)
,
:LAB_VALUE =="MILD",
If( N Rows( dt << get rows where(
Row()>theRow &
thePatient_ID == :PATIENT_ID &
:LAB_VALUE == "SEVERE"
)
) > 0
,
2
)
,
:LAB_VALUE == "SEVERE"
If( N Rows( ct << get rows where(
Row()>theRow &
thePatient_ID == :PATIENT_ID &
(:LAB_VALUE == "MILD" | :LAB_VALUE == "NORMAL")
)
) > 0
,
3
)
)
)
)
);我可以想像一種更有效的方法來做到這一點,但它不會作為公式實現,而是作為使用某些 JMP 平台的腳本實現。
回复:如何根據其他兩個列的值創建新列?這是設置 STATUS 值的一種方法。這不是非常有效的代碼,但它應該可以工作。我無法完全測試它,但邏輯非常簡單。
dt = current data table();
dt << New Column( "STATUS", formula(
If( :TIME == "BASELINE",
theRow = Row();
thePatient_ID = :PATIENT_ID;
If(:LAB_VALUE == "NORMAL",
If( N Rows( dt << get rows where(
Row()>theRow &
thePatient_ID == :PATIENT_ID &
(:LAB_VALUE == "MILD" | :LAB_VALUE == "SEVERE")
)
) > 0
,
1,
)
,
:LAB_VALUE =="MILD",
If( N Rows( dt << get rows where(
Row()>theRow &
thePatient_ID == :PATIENT_ID &
:LAB_VALUE == "SEVERE"
)
) > 0
,
2
)
,
:LAB_VALUE == "SEVERE"
If( N Rows( ct << get rows where(
Row()>theRow &
thePatient_ID == :PATIENT_ID &
(:LAB_VALUE == "MILD" | :LAB_VALUE == "NORMAL")
)
) > 0
,
3
)
)
)
)
);
我可以想像一種更有效的方法來做到這一點,但它不會作為公式實現,而是作為使用某些 JMP 平台的腳本實現。