R 将一系列事件转换为持续时间

R 将一系列事件转换为持续时间,r,R,我对编程并不陌生,但对R非常陌生。我有一个CSV,上面有开和关事件,如下所示: event_time user_id on 1 2016-01-29 05:23:32 Z388FPKNEAQF FALSE 2 2016-01-29 05:23:19 Z388FPKNEAQF TRUE 3 2016-01-29 05:13:24 Z388FPKNEAQF FALSE 4 2016-01-29 05:13:09 Z388FPKNEAQF TRUE 5 201

我对编程并不陌生,但对R非常陌生。我有一个CSV,上面有开和关事件,如下所示:

           event_time      user_id    on
1 2016-01-29 05:23:32 Z388FPKNEAQF FALSE
2 2016-01-29 05:23:19 Z388FPKNEAQF  TRUE
3 2016-01-29 05:13:24 Z388FPKNEAQF FALSE
4 2016-01-29 05:13:09 Z388FPKNEAQF  TRUE
5 2016-01-29 05:13:07 Z388FPKNEAQF FALSE
6 2016-01-29 05:00:05 Z388FPKNEAQF  TRUE
为了让您了解数据,第1行和第2行表示用户在05:23:19打开屏幕,然后在05:23:19关闭屏幕。我想写一些R来将其转换成一个框架,其中来自源框架的行被折叠成持续时间。即,第1行和第2行将折叠为一行,如下所示:

          event_start      user_id  duration
1 2016-01-29 05:23:19 Z388FPKNEAQF        12 
我正在努力研究如何用R实现。在Python这样的语言中,用某种形式的循环来实现这一点是很自然的,但在R中,使用Reduce似乎更为惯用,也许?然而,我一点也不理解它的语法是什么样子的,我希望能得到一些指导来让我继续

像这样:

df <- read.table(header=T, sep=",", text="
event_time,user_id,on
1,2016-01-29 05:23:32,Z388FPKNEAQF,FALSE
2,2016-01-29 05:23:19,Z388FPKNEAQF,TRUE
3,2016-01-29 05:13:24,Z388FPKNEAQF,FALSE
4,2016-01-29 05:13:09,Z388FPKNEAQF,TRUE
5,2016-01-29 05:13:07,Z388FPKNEAQF,FALSE
6,2016-01-29 05:00:05,Z388FPKNEAQF,TRUE")
df$event_time <- as.POSIXct(df$event_time)
aggregate(
  event_time~., 
  data = transform(df, on=cumsum(!df$on)), 
  FUN = function(x) max(x)-min(x)
)
#        user_id id event_time
# 1 Z388FPKNEAQF  1  13.00000 
# 2 Z388FPKNEAQF  2  15.00000 
# 3 Z388FPKNEAQF  3  13.03333 

df这给了我一个错误:总结中的错误。因子(c(6L,5L),na.rm=FALSE):“max”对因子没有意义