【问题标题】:matching time a time in the interval between a start and end time匹配时间 开始时间和结束时间之间的时间间隔
【发布时间】:2011-07-04 15:18:33
【问题描述】:

StackOverflow 的 R 用户-

我必须将一组不同的时间与另一个数据帧中由开始和结束定义的时间间隔相匹配。这将导致一个数据帧具有多对一关系。

要匹配的简化记录集如下:

       vid               start                 end
17599 7588 2011-02-14 19:00:00 2011-02-14 19:11:00
17601 7588 2011-02-14 19:58:00 2011-02-14 20:43:00
17603 7588 2011-02-14 21:22:00 2011-02-14 22:00:00

与上述数据匹配的一些示例记录是:

        vid            datetime
469818 7588 2011-02-14 19:00:10
470747 7588 2011-02-14 19:59:10
470788 7588 2011-02-14 21:23:10

我想要的是这样的:

        vid            datetime               start                 end
        7588 2011-02-14 19:00:10 2011-02-14 19:00:00 2011-02-14 19:11:00
        7588 2011-02-14 19:59:10 2011-02-14 19:58:00 2011-02-14 20:43:00
        7588 2011-02-14 21:23:10 2011-02-14 21:22:00 2011-02-14 22:00:00

对于我的一生,我不知道如何在 R 中做到这一点。任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: datetime r time


    【解决方案1】:

    可重现的例子:

    txt1 <- "       vid               start                 end
    17599 7588 '2011-02-14 19:00:00' '2011-02-14 19:11:00'
    17601 7588 '2011-02-14 19:58:00' '2011-02-14 20:43:00'
    17603 7588 '2011-02-14 21:22:00' '2011-02-14 22:00:00'
    "
    txt2 <- "        vid            datetime
    469818 7588 '2011-02-14 19:00:10'
    470747 7588 '2011-02-14 19:59:10'
    470788 7588 '2011-02-14 21:23:10'
    "
    d1 <- read.table(textConnection(txt1), header = TRUE,
                     colClasses = c("integer","integer","POSIXct","POSIXct"))
    d2 <- read.table(textConnection(txt2), header = TRUE,
                     colClasses = c("integer","integer","POSIXct"))
    

    我们可以得到d1中对应d2每一行的索引(行):

    > idx <- sapply(d2$datetime, 
    +               function(x, start, end) {which(x > start & x < end)}, 
    +               d1$start, d1$end)
    > idx
    [1] 1 2 3
    

    我们可以使用索引idxd1 的元素绑定到d2

    > cbind(d2, d1[idx, 2:3])
            vid            datetime               start                 end
    469818 7588 2011-02-14 19:00:10 2011-02-14 19:00:00 2011-02-14 19:11:00
    470747 7588 2011-02-14 19:59:10 2011-02-14 19:58:00 2011-02-14 20:43:00
    470788 7588 2011-02-14 21:23:10 2011-02-14 21:22:00 2011-02-14 22:00:00
    

    【讨论】:

    • 感谢您的回答,加文。也许我在最初的陈述中并不清楚,但我需要一个多对一的匹配,并且不能保证数据的排序和我的示例一样好。但是我确实解决了这个问题,使用 >= 和 = d2.start & d1$datetime
    【解决方案2】:

    我确实解决了这个问题,但在使用 split() 拆分数据之后,使用 >= 和 match.col = with(d2[[v]], d1$datetime >= d2.start & d1$datetime <= d2.end)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多