비디오 스트리밍 재생 정보가있는 데이터 세트가 있습니다. 각 세션은 누군가가 일시 중지되었을 때, 재생 헤드를 앞으로 또는 뒤로 이동했을 때 등과 같은 세그먼트로 분할됩니다. 중복되는 세션 세그먼트를 두 배로 늘리지 않는 방식으로 스트리밍 재생 데이터를 집계하려고합니다. 이하 간략화 된 실시 예에서, 각 세션 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))))
모든 아이디어를 환영합니다!
어쩌면 – mdsumner
fuzzyjoin @mdsumner :
그래서 당신은 단순히 첫 번째 그룹화 할 필요가 내가 fuzzyjoin' 여기에'사용하는 방법을 볼 수 없습니다, 당신이 개발할 수 있을까? 나는 정말로 흥미가있을 것이다. – Scarabee