R从重叠部分计算会话持续时间
R calculate session duration from overlapping parts
我有一个包含视频流播放信息的数据集。每个会话都分成与某人暂停、向前或向后移动播放头等时间相对应的片段......
我正在尝试以不重复计算重叠会话段的方式聚合流播放数据。在下面的简化示例中,对于每个会话 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 开始,我可以使用包 Intervals 来计算非重叠会话播放时间:
library(intervals)
x1<-Intervals(df[1:3,c('start','end')])
x1
# class 个区间的对象
# R 上的 3 个间隔:
# 1 [1, 4]
# 2 [10, 18]
# 3 [15, 20]
interval_intersection(x1)
# class 个区间的对象
# 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)))
这不起作用,因为我不能在 mutate 中使用函数 Intervals。
我也试过 tapply,但也没用:
df.intervals<-Intervals(df[c('start','end')])
tapply(df.intervals, df$session, function(x) sum(size(interval_intersection(x))))
欢迎任何想法!
您不能以 mutate
开头,因为结果不是长度为 nrow(df)
的向量,而是 "Object of class Intervals"(即使它包含 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
我有一个包含视频流播放信息的数据集。每个会话都分成与某人暂停、向前或向后移动播放头等时间相对应的片段...... 我正在尝试以不重复计算重叠会话段的方式聚合流播放数据。在下面的简化示例中,对于每个会话 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 开始,我可以使用包 Intervals 来计算非重叠会话播放时间:
library(intervals)
x1<-Intervals(df[1:3,c('start','end')])
x1
# class 个区间的对象
# R 上的 3 个间隔:
# 1 [1, 4]
# 2 [10, 18]
# 3 [15, 20]
interval_intersection(x1)
# class 个区间的对象
# 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)))
这不起作用,因为我不能在 mutate 中使用函数 Intervals。
我也试过 tapply,但也没用:
df.intervals<-Intervals(df[c('start','end')])
tapply(df.intervals, df$session, function(x) sum(size(interval_intersection(x))))
欢迎任何想法!
您不能以 mutate
开头,因为结果不是长度为 nrow(df)
的向量,而是 "Object of class Intervals"(即使它包含 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