2017-04-07 78 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