如何根据其他两个列的值创建新列?你好:
我是 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 平台的脚本实现。