我有一个包含视频流播放信息的数据集。每个会话分为几个部分,分别对应于某人暂停,向前或向后移动播放头等等... 我试图以这样的方式聚合流式播放数据,即我不会重复计算重叠的会话段。在下面的简化示例中,对于每个会话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))))
欢迎任何想法!
答案 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