2017-04-07 44 views
1

我有一个包含视频流播放信息的数据集。每个会话都按照某人暂停,向前或向后移动播放头等分段进行分割... 我试图以不重叠会话段数的方式聚合流式播放数据。在下面的简化示例中,每个会话A,B,C,我可以有一个以上的再现区间和它们可以重叠:R从重叠部分计算会话持续时间

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

与会话开始A,其是在3个区段,我可以使用包间隔来计算非重叠会话播放时间:类间隔的

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

#对象

#3的间隔在R:

#1 [1,4]

#2 [10,18]

#3 [15,20]类区间的

interval_intersection(x1) 

#对象

#2的间隔在R:

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

这并不工作,因为我不能在发生变异使用的功能区间。

我也试图与tapply但没有工作,要么:

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

任何想法表示欢迎!

+0

也许fuzzyjoin – mdsumner

+0

@mdsumner:我无法看到如何使用'fuzzyjoin'在这里,你能发展?我真的很感兴趣。 – Scarabee

回答

1

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