2016-03-02 126 views
0

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

另一个系列是可以在任何阶段记录的时间(我将称之为S2)。
我试图以这样的方式整合这些数据,以便如果在S1的某个点的前2分钟内发生了来自S2的事件,则会给出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

首先,你需要将时间转化成时间戳:

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

为了做计数,你可以在S1使用sapply()在所有的时间戳。该代码利用的事实,你可以简单地从POSIXct时间戳添加或subract秒的优势:

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 
+0

谢谢!这正是我需要的!我非常感谢帮助 – Ash

3

我假定这些都是每一个排序,但如果没有,排序s2第一。然后你可以找到最近的s2,每个s1findInterval

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)) 
 
     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