使用 R 计算流程中连续阶段之间的事件

Conting events between sequential stages in a process using R

我一直在尝试解决教科书中的一个练习,在这个练习中我面临着计算工业过程连续阶段之间不同事件的挑战。

过程相关信息:一个测试对象要经过3个阶段的过程,阶段A,B和C分别是第一个是A,第二个是B和最后C;测试对象可以在阶段 A 或 B 放弃过程,然后从 A 点重新开始,每次过程发生时都会创建一个数据集,其中包含测试对象的 IDENTIFICATION、阶段发生的 TIMESTAMP 和唯一的 VISIT_CODE 在任何阶段,测试对象都可能触发“警报”,这将与时间戳、ALERT_CODE 和测试对象身份一起记录。

要计算的内容: 我必须在 R 中创建一个代码来计算测试对象在阶段 A 和 B 之间、阶段 B 和 C 之间生成了多少警报,最后在 C 之后生成了多少警报。请注意,测试对象可能在某个时候放弃该过程,稍后从 A 点重新开始。

课本给了一个提示: “仔细查看测试对象当前所处的阶段,然后确定警报是否从 A 阶段和 B 阶段之前产生,以及测试对象是否在 B 阶段之后和 C 阶段之前触发警报,但请记住如果测试对象在阶段 A 放弃并触发警报,如果该警报的时间戳小于他们在阶段 A 的下一次尝试,那么它应该被记为阶段 A 之后的警报

作为另一个提示,教科书揭示了阶段 C 之后的警报只有 1,并且它是由具有 ALTER_CODE AYUJ 的测试对象 W-6 触发的3915716168。 数据集是:

阶段过程

TableA<-tribble(~STAGE, ~TEST_SUBJECT,~TIMESTAMP,~VISIT_CODE,
"A",    "XYU-1",    "10",   "BKO",
"A",    "XYU-1",    "15",   "JUJD",
"B",    "XYU-1",    "20",   "DUDH",
"A",    "FF-09",    "25",   "KSIWJD",
"B",    "FF-09",    "30",   "AJAKAM",
"C",    "FF-09",    "35",   "ZISKS",
"A",    "UU-89",    "40",   "NNXJD",
"B",    "UU-89",    "45",   "DDUWO",
"A",    "I-44", "50",   "JIWIW",
"A",    "W-6",  "55",   "SHDN",
"B",    "W-6",  "60",   "IWOLS",
"C",    "W-6",  "65",   "JDDD",
"A",    "U-90", "70",   "DJDKSMS",
"B",    "U-90", "75",   "NDJSM",
"A",    "T-87", "80",   "DNDJDK")

警报数据集

TableB<-tribble(~TEST_SUBJECT,~TIMESTAMP,~ALERT_CODE,
"XYU-1",    "11",   "AYUJ-151571406",
"XYU-1",    "12",   "AYUJ-487008829",
"XYU-1",    "28",   "AYUJ-211990388",
"FF-09",    "32",   "AYUJ-4177221842",
"W-6",  "56",   "AYUJ-1300211351",
"W-6",  "63",   "AYUJ-3014305494",
"I-44", "67",   "AYUJ-4454800551",
"U-90", "73",   "AYUJ-1079921935",
"U-90", "76",   "AYUJ-3348911727",
"U-90", "79",   "AYUJ-2381219626",
"T-87", "82",   "AYUJ-4778326278",
"W-6",  "89",   "AYUJ-3915716168")

解决方案:

课本上说这个问题的正确解法是:

阶段 A 和 B 之间的警报,包括来自在阶段 A 的第 n 次尝试中放弃过程的测试对象的警报 阶段 B 和 C 之间的警报,包括来自在阶段 B 的第 n 次尝试中放弃该过程的测试对象的警报 C 阶段后的警报
AYUJ-151571406 AYUJ-211990388 AYUJ-3915716168
AYUJ-487008829 AYUJ-3014305494
AYUJ-1300211351 AYUJ-3348911727
AYUJ-1079921935 AYUJ-4177221842
AYUJ-4778326278 AYUJ-2381219626
AYUJ-4454800551

我做了什么? :我已经尝试通过 TEST_SUBJECT 和阶段和时间戳对数据进行分组和“加入”以进行计数,但是我发现很难设置条件以使代码在阶段之间对事件进行计数,因为我发现很难按测试对象和阶段关联每个时间跨度前后发生的事件。

非常感谢所有才华横溢的人的帮助或推荐

这是一个 data.table 方法,在 a-b-c..

之后生成一个警报列表
library(data.table)
# Make tables data.table format
setDT(TableA)
setDT(TableB)
# set TiMESTAP to numeric
TableA[, TIMESTAMP := as.numeric(TIMESTAMP)]
TableB[, TIMESTAMP := as.numeric(TIMESTAMP)]
# Create data.table with Stage intervals by test subject
DT.interval <- TableA[, .(start = min(TIMESTAMP)), by = .(TEST_SUBJECT, STAGE)]
# Perform rolling join
TableB[, Stage := DT.interval[TableB, 
                              STAGE, 
                              on = .(TEST_SUBJECT, start = TIMESTAMP), 
                              roll = Inf]][]
# Split alerts by stage
split(TableB[,3:4], by = "Stage")
# $A
#         ALERT_CODE Stage
# 1:  AYUJ-151571406     A
# 2:  AYUJ-487008829     A
# 3: AYUJ-1300211351     A
# 4: AYUJ-4454800551     A
# 5: AYUJ-1079921935     A
# 6: AYUJ-4778326278     A
# 
# $B
#         ALERT_CODE Stage
# 1:  AYUJ-211990388     B
# 2: AYUJ-4177221842     B
# 3: AYUJ-3014305494     B
# 4: AYUJ-3348911727     B
# 5: AYUJ-2381219626     B
# 
# $C
#         ALERT_CODE Stage
# 1: AYUJ-3915716168     C