【问题标题】:Conting events between sequential stages in a process using R使用 R 计算流程中连续阶段之间的事件
【发布时间】:2021-07-10 19:12:50
【问题描述】:

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

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

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

教科书给出了提示: “仔细查看测试对象当前所处的阶段,然后确定 ALERT 是否是从 A 阶段和 B 阶段之前生成的,以及测试对象是否在 B 阶段之后和 C 阶段之前触发了 ALERT,但请记住如果测试对象在 A 阶段放弃并触发 ALERT,如果该 ALERT 的 TIMESTAMP 小于他们在 A 阶段的下一次尝试,那么它应该在 A 阶段之后被记为 ALERT"

作为另一个提示,教科书显示阶段 C 之后的 ALERTS 只有 1 并且它是由测试对象 W-6 使用 ALTER_CODE AYUJ-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")

解决方案:

教科书指出这个问题的正确解决方案是:

Alerts between Stages A & B including alerts from test subjects that abandoned the process in the attempt nth at stage A Alerts between Stages B & C including alerts from test subjects that abandoned the process in the attempt nth at stage B Alerts after stage 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 和阶段和时间戳对数据进行分组和“加入”以进行计数,但我发现很难设置条件以在阶段之间进行代码计数事件,因为我发现很难关联哪些事件发生了根据测试对象和阶段在每个时间跨度之前和之后放置。

非常感谢所有有才华和酷的人的帮助或建议

【问题讨论】:

  • 警报表中的示例数据似乎缺少一列?
  • 您好!感谢您指出我已修复它!非常感谢

标签: r algorithm count data-science data-wrangling


【解决方案1】:

这是一个data.table apprioach,在 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

【讨论】:

  • 我不知道这段代码是如何解决问题的,但先生,一切都归功于你! 10/10 我猜 data.table 是未来,我必须使用它,因为我无法使用 Tidyverse 提出解决方案
  • 您对代码的哪些部分有疑问?关键是滚动连接,对于 TableB 中的每个 Alert,都会在间隔表中查找具有相同 test_subject 的最新时间戳。
  • 太棒了,谢谢你,F...这就是我今年听到的最酷的功能之一,似乎 data.table 比 tidyverse 强大得多,我是一名 R 学生如果您能推荐您认为最适合数据处理的软件包,那将非常高兴
  • 我似乎经常使用的有用包是:data.table、tidyverse-packages、sf、igraph、fuzzyjoin、leaflet、openxlsx。但我将使用什么取决于手头的工作。 data.table 与 tidyverse;大多数时候,您可以解决这两个软件包的大多数问题。一般来说,data.table 在开始时有一点学习曲线,并且在处理大型数据集时(通常)更快。 Tidyverse 的代码非常易读,即使对于非 R 程序员也是如此。
猜你喜欢
  • 2010-10-28
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
相关资源
最近更新 更多