【问题标题】:R calculate session duration from overlapping partsR从重叠部分计算会话持续时间
【发布时间】:2017-04-07 20:01:20
【问题描述】:

我有一个包含视频流播放信息的数据集。每个会话都被分成几段,对应于某人暂停、向前或向后移动播放头等的时间...... 我正在尝试以一种不会重复计算重叠会话段的方式聚合流式播放数据。在下面的简化示例中,对于每个会话 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 段的 session A 开始,我可以使用包 Intervals 来计算不重叠的 session 播放时间:

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

#Intervals 类的对象

#R 上的 3 个间隔:

#1 [1, 4]

#2 [10, 18]

#3 [15, 20]

interval_intersection(x1)

#Intervals 类的对象

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

欢迎任何想法!

【问题讨论】:

  • 也许是模糊连接
  • @mdsumner:这里看不到fuzzyjoin怎么用,能开发吗?我真的很感兴趣。

标签: r dplyr intervals


【解决方案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

【讨论】:

    猜你喜欢
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多