我在不同的数据帧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的时间完全相同的情况? 任何帮助,将不胜感激!
谢谢
答案 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