R从重叠部分计算会话持续时间

R calculate session duration from overlapping parts

我有一个包含视频流播放信息的数据集。每个会话都分成与某人暂停、向前或向后移动播放头等时间相对应的片段...... 我正在尝试以不重复计算重叠会话段的方式聚合流播放数据。在下面的简化示例中,对于每个会话 A、B、C,我可以有多个播放片段并且它们可以重叠:

df<-data.frame(session=c(rep("A",3), rep("B",5), "C"), 
           start=c(1,10,15,1,3,8,14,17,2), 
           end=c(4,18,20,10,5,12,16,20,10))

从分为 3 个片段的会话 A 开始,我可以使用包 Intervals 来计算非重叠会话播放时间:

library(intervals)
x1<-Intervals(df[1:3,c('start','end')])
x1

# class 个区间的对象

# R 上的 3 个间隔:

# 1 [1, 4]

# 2 [10, 18]

# 3 [15, 20]

interval_intersection(x1)

# class 个区间的对象

# R 上的 2 个间隔:

# [1, 4]

# [10, 20]

size(interval_intersection(x1))

# [1] 3 10

sum(size(interval_intersection(x1))) 

#[1]13

所以这为我提供了会话 A 的非重叠会话持续时间。现在我想获取我所有会话的会话持续时间。我希望我可以将类似的东西与 dplyr 一起使用,但我似乎无法整合间隔:

library(dplyr)
df %>% 
mutate(interval=Intervals(start, end)) %>% 
group_by(session) %>%
summarise(session_duration=sum(size(interval_intersection(interval)))

这不起作用,因为我不能在 mutate 中使用函数 Intervals。

我也试过 tapply,但也没用:

df.intervals<-Intervals(df[c('start','end')])
tapply(df.intervals, df$session, function(x) sum(size(interval_intersection(x))))

欢迎任何想法!

您不能以 mutate 开头,因为结果不是长度为 nrow(df) 的向量,而是 "Object of class Intervals"(即使它包含 nrow(df) 间隔).

所以您只需先进行分组:

library(intervals)
library(dplyr)

df %>% 
  group_by(session) %>%
  summarise(session_duration = sum(size(interval_intersection(Intervals(c(start, end))))))

# # A tibble: 3 × 2
#   session session_duration
#    <fctr>            <dbl>
# 1       A               13
# 2       B               16
# 3       C                8