选择特定时间范围内的行

zxw*_*mes 7 r dataframe

我有一个数据框,如:

TimeStamp                    Category

2013-11-02 07:57:18 AM         0
2013-11-02 08:07:19 AM         0
2013-11-02 08:07:21 AM         0
2013-11-02 08:07:25 AM         1
2013-11-02 08:07:29 AM         0
2013-11-02 08:08:18 AM         0
2013-11-02 08:09:20 AM         0
2013-11-02 09:04:18 AM         0
2013-11-02 09:05:22 AM         0
2013-11-02 09:07:18 AM         0
Run Code Online (Sandbox Code Playgroud)

我想要做的是选择Category"1" 时的+ -10分钟时间帧.

对于这种情况,因为category = 12013-11-02 08:07:25 AM,我想选择其中的所有行07:57:25 AM to 08:17:25 AM.

处理此任务的最佳方法是什么?

另外,每个时间帧可能有多个"1".(真正的数据框架更复杂,它包含多个具有不同用户的TimeStamp,即另一列名为"UserID")

the*_*ail 10

在基础R中,没有润滑或其他任何东西(假设您要将TimeStamp转换为POSIXct对象),如:

df$TimeStamp <- as.POSIXct(TimeStamp, format = "%Y-%m-%d %I:%M:%S %p")
df[with(df, abs(difftime(TimeStamp[Category==1],TimeStamp,units="mins")) <= 10 ),]

#            TimeStamp Category
#2 2013-11-02 08:07:19        0
#3 2013-11-02 08:07:21        0
#4 2013-11-02 08:07:25        1
#5 2013-11-02 08:07:29        0
#6 2013-11-02 08:08:18        0
#7 2013-11-02 08:09:20        0
Run Code Online (Sandbox Code Playgroud)

如果你有多个1,你必须循环它,如:

check <- with(df, 
  lapply(TimeStamp[Category==1], function(x) abs(difftime(x,TimeStamp,units="mins")) <= 10 ) 
)
df[do.call(pmax, check)==1,]
Run Code Online (Sandbox Code Playgroud)


Dav*_*urg 7

以下是我将如何使用它 data.table::foverlaps

首先,转换TimeStamp为正确的POSIXct

library(data.table)
setDT(df)[, TimeStamp := as.POSIXct(TimeStamp, format = "%Y-%m-%d %I:%M:%S %p")]
Run Code Online (Sandbox Code Playgroud)

然后我们将创建一个临时数据集Category == 1来加入.我们还将创建一个"结束"列以及key"开始"和"结束"列

df2 <- setkey(df[Category == 1L][, TimeStamp2 := TimeStamp], TimeStamp, TimeStamp2)
Run Code Online (Sandbox Code Playgroud)

然后,我们将做同样的事情,df但会设置10分钟的间隔

setkey(df[, `:=`(start = TimeStamp - 600, end = TimeStamp + 600)], start, end)
Run Code Online (Sandbox Code Playgroud)

然后,剩下要做的就是foverlaps按匹配的事件运行和子集

indx <- foverlaps(df, df2, which = TRUE, nomatch = 0L)$xid
df[indx, .(TimeStamp,  Category)]
#              TimeStamp Category
# 1: 2013-11-02 08:07:19        0
# 2: 2013-11-02 08:07:21        0
# 3: 2013-11-02 08:07:25        1
# 4: 2013-11-02 08:07:29        0
# 5: 2013-11-02 08:08:18        0
# 6: 2013-11-02 08:09:20        0
Run Code Online (Sandbox Code Playgroud)