整合两个时间序列以产生二进制输出

时间:2016-03-02 15:29:07

标签: r

我在不同的数据帧R中有两个时间序列,我希望以二进制方式集成它们。 一个系列(我称之为S1)是长时间每两分钟一次的时间点。

另一个系列是可以在任何阶段录制的时间(我将称之为S2) 我尝试以某种方式整合这些,以便如果S2中的某个事件发生在距离S1中的一个点的前2分钟内,则给出1(如果没有事件则相应的0)。

S1$time                            
11:01:46        
11:03:46
11:05:46
11:07:46 
11:09:46 
11:11:46 

S2$time
10:00:12.10
11:03:12.20
11:05:50.10
11:08:10.00

会变成:

S1$time       binary
11:01:46      0  
11:03:46      1
11:05:46      0
11:07:46      1
11:09:46      1
11:11:46      0

可重复的示例数据:

 time<-c("11:01:46","11:03:46","11:05:46","11:07:46","11:09:46","11:11:46")
 S1<-as.data.frame(time)
 time<-c("10:00:12.10","11:03:12.20","11:05:50.10","11:08:10.00")
 S2<-as.data.frame(time)

我只是不太确定如何解决这个问题 - 我试图给所有S2变量提供正二进制响应,然后合并数据帧,如下所示:

 bin<-rep(1,4)
 S2$binary<-bin
 merge(S1,S2,by="time")

但这似乎只适用于S1和S2的时间完全相同的情况? 任何帮助,将不胜感激!

谢谢

2 个答案:

答案 0 :(得分:3)

我假设这些都是排序的,但如果没有,请先排序s2。然后,您可以使用s1找到每个findInterval最近的s1 <- strptime(c("11:01:46","11:03:46","11:05:46","11:07:46","11:09:46","11:11:46"), format="%T") s2 <- strptime(c("10:00:12.10","11:03:12.20","11:05:50.10","11:08:10.00"), format="%T") data.frame(s1=format(s1,"%T"),flag=as.numeric(s1 - s2[findInterval(s1,s2)] < 120))

Topics.update(roomId ,{ $addToSet: { users: this.userId }, $inc: { number: 1 }});
        s1 flag
1 11:01:46    0
2 11:03:46    1
3 11:05:46    0
4 11:07:46    1
5 11:09:46    1
6 11:11:46    0

答案 1 :(得分:2)

首先,您需要将时间转换为时间戳:

S1$ts <- as.POSIXct(S1$time, format = "%H:%M:%S")
S2$ts <- as.POSIXct(S2$time, format = "%H:%M:%S")

为了执行计数,您可以在sapply()中的所有时间戳上使用S1。代码利用了这样一个事实:您可以简单地添加或减少POSIXct时间戳中的秒数:

S1$counts <- sapply(S1$ts, function(t)
                    as.numeric(any(S2$ts < t & S2$ts >= t - 120)))
S1
##       time                  ts counts
## 1 11:01:46 2016-03-02 11:01:46      0
## 2 11:03:46 2016-03-02 11:03:46      1
## 3 11:05:46 2016-03-02 11:05:46      0
## 4 11:07:46 2016-03-02 11:07:46      1
## 5 11:09:46 2016-03-02 11:09:46      1
## 6 11:11:46 2016-03-02 11:11:46      0