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

时间:2017-04-07 20:01:21

标签: r dplyr intervals

我有一个包含视频流播放信息的数据集。每个会话分为几个部分,分别对应于某人暂停,向前或向后移动播放头等等... 我试图以这样的方式聚合流式播放数据,即我不会重复计算重叠的会话段。在下面的简化示例中,对于每个会话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开始,我可以使用包间隔来计算非重叠会话回放时间:

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

#Intertries Intervals的对象

在R上的#3个间隔:

#1 [1,4]

#2 [10,18]

#3 [15,20]

interval_intersection(x1)

#Intertries Intervals的对象

超过R的#2间隔:

#[1,4]

#[10,20]

size(interval_intersection(x1))

#[1] 3 10

sum(size(interval_intersection(x1))) 

#[1] 13

因此,这为会话A提供了非重叠的会话持续时间。现在,我希望获得所有会话的会话持续时间。我希望我能用dplyr这样的东西,但我似乎无法整合Intervals:

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))))

欢迎任何想法!

1 个答案:

答案 0 :(得分:1)

您不能以mutate开头,因为结果不是长度为nrow(df)的向量,而是&#34;类间隔对象&#34; (即使它包含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