gpt4 book ai didi

r - 我需要一个循环来根据 R 中的时间戳差异删除行

转载 作者:行者123 更新时间:2023-12-04 12:29:24 26 4
gpt4 key购买 nike

我正在做一个项目,其中有几百万行,每行都包含时间戳。每行还包括该事件的唯一 ID。当前条件是具有相同事件 ID 的行可以有 1 分钟的时间戳差异(不能有两个事件的增量时间戳小于 1 分钟)。

我想模拟的是如果最小时间戳差异为 3 分钟会发生的情况。

    TIME_STAMP              PREV_TIME_STAMP      Unique ID 
06-27-2021 07:07:22 06-27-2021 06:30:00 1
06-27-2021 07:18:26 06-27-2021 07:07:22 1
06-27-2021 07:20:26 06-27-2021 07:18:26 1
06-27-2021 07:22:26 06-27-2021 07:20:26 1
06-27-2021 07:22:26 06-27-2021 07:22:26 1
06-27-2021 15:18:05 06-27-2021 15:11:00 2
06-27-2021 15:19:05 06-27-2021 15:18:05 2
06-27-2021 12:31:37 06-27-2021 12:30:00 2
06-27-2021 12:35:05 06-27-2021 12:30:00 2

问题是我不能只用消息之间的差异创建新列,我确实需要一个循环 - 为什么?见下文:

从表来看,情况如下:
  • 第一行被接受,因为增量是 37 分钟
  • 第二行被接受,因为增量为 11 分钟
  • 第三排 不接受 因为增量为 1.5 分钟
  • 第四排被接受 因为之前的事件是 不是
    07:20:26,现在是07:18:26(第三行被删除,所以不考虑!)。因此,第 4 行的增量时间为 07:22:26 - 07:18:26 = 4 分钟 > 3 分钟,这意味着接受

  • 所以需要定义一个引用时间戳(它是前一个接受时间),新时间和上一个被接受时间之间的差值必须是 3 分钟或更长。

    我希望我能很好地解释它。如果没有,请回答,我会提供尽可能多的信息。

    提前致谢!

    编辑:
    df <- data.frame(TIME_STAMP = as.POSIXct(strptime(
    c("06-27-2021 07:07:22",
    "06-27-2021 07:18:26",
    "06-27-2021 07:20:26",
    "06-27-2021 07:22:26",
    "06-27-2021 07:22:26",
    "06-27-2021 15:18:05",
    "06-27-2021 15:19:05",
    "06-27-2021 12:31:37",
    "06-27-2021 12:35:05"), "%m-%d-%Y %H:%M:%S")),
    PREV_TIME_STAMP = as.POSIXct(strptime(
    c("06-27-2021 06:30:00",
    "06-27-2021 07:07:22",
    "06-27-2021 07:18:26",
    "06-27-2021 07:20:26",
    "06-27-2021 07:22:26",
    "06-27-2021 15:11:00",
    "06-27-2021 15:18:05",
    "06-27-2021 12:30:00",
    "06-27-2021 12:30:00"), "%m-%d-%Y %H:%M:%S")),
    ID = c(1,1,1,1,1,2,2,2,2))

    最佳答案

    首先,您应该重新排列数据并删除两个时间列的冗余:

    library(data.table)
    DT <- fread(" TIME_STAMP, Unique ID
    06-27-2021 06:30:00, 1
    06-27-2021 07:07:22, 1
    06-27-2021 07:18:26, 1
    06-27-2021 07:20:26, 1
    06-27-2021 07:22:26, 1
    06-27-2021 07:22:26, 1
    06-27-2021 15:11:00, 2
    06-27-2021 15:18:05, 2
    06-27-2021 15:19:05, 2
    06-27-2021 12:31:37, 2
    06-27-2021 12:35:05, 2")

    然后您可以使用 Rcpp 轻松完成此操作:
    library(Rcpp)

    cppFunction(
    'LogicalVector deleteRow(const NumericVector x) {
    const double n = x.size();
    double j = 0;
    LogicalVector res = LogicalVector(n);
    for (double i = 1; i < n; i++) {
    if (x(i) - x(j) < 180) {
    res[i] = true;
    } else {
    j = i;
    }
    }

    return res;
    }')

    DT[, TIME_STAMP := as.POSIXct(TIME_STAMP, format = "%m-%d-%Y %H:%M:%S", tz = "GMT")]
    setkey(DT, `Unique ID`, TIME_STAMP) #ensure sorting
    DT[, delete := deleteRow(TIME_STAMP), by = `Unique ID`]
    # TIME_STAMP Unique ID delete
    # 1: 2021-06-27 06:30:00 1 FALSE
    # 2: 2021-06-27 07:07:22 1 FALSE
    # 3: 2021-06-27 07:18:26 1 FALSE
    # 4: 2021-06-27 07:20:26 1 TRUE
    # 5: 2021-06-27 07:22:26 1 FALSE
    # 6: 2021-06-27 07:22:26 1 TRUE
    # 7: 2021-06-27 12:31:37 2 FALSE
    # 8: 2021-06-27 12:35:05 2 FALSE
    # 9: 2021-06-27 15:11:00 2 FALSE
    #10: 2021-06-27 15:18:05 2 FALSE
    #11: 2021-06-27 15:19:05 2 TRUE

    关于r - 我需要一个循环来根据 R 中的时间戳差异删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50465590/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com