2017-04-07 1 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)) 

세션부터 3 개 세그먼트에있는 A, I 패키지를 사용하여 간격은 겹치지 세션 재생 시간을 산출한다 : 클래스 간격

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

# 개체

# R 위에 3 간격 :

# 1 [1, 4]

# 2 [10, 18]

# 3 [15, 20] 클래스 간격

interval_intersection(x1) 

# 개체

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

이 작동하지 않습니다.

가 나는 또한 tapply으로 시도했지만 그 중 하나가 작동하지 않았다 :

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

모든 아이디어를 환영합니다!

+0

어쩌면 – mdsumner

+0

fuzzyjoin @mdsumner :

그래서 당신은 단순히 첫 번째 그룹화 할 필요가 내가 fuzzyjoin' 여기에'사용하는 방법을 볼 수 없습니다, 당신이 개발할 수 있을까? 나는 정말로 흥미가있을 것이다. – Scarabee

답변

1

nrow(df) 간격을 포함하고 있지만 결과는 길이가 nrow(df) 인 "Object of class Intervals"가 아니기 때문에 mutate으로 시작할 수 없습니다.

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 
관련 문제