我有一个数据框,如:
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 = 1
是2013-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)
以下是我将如何使用它 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)
归档时间: |
|
查看次数: |
1597 次 |
最近记录: |