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中做到这一点。任何帮助将不胜感激。谢谢!
答案 0 :(得分: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
我们可以使用索引idx
将d1
的元素绑定到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
答案 1 :(得分:1)
我做了,但是在使用split()分割数据后,使用&gt; =和&lt; =运算符来比较start,end和datetime字段。 ; match.col = with(d2[[v]], d1$datetime >= d2.start & d1$datetime <= d2.end)