将语音开始和结束时间转换为时间序列

Convert Speech Start and End Time into Time Series

我想将以下 R 数据帧转换为按秒索引的数据帧,但不知道该怎么做。也许是 dcast,但后来对如何扩展正在说的单词感到困惑。

startTime endTime           word
1     1.900s  2.300s         hey
2     2.300s  2.800s         I'm
3     2.800s      3s        John
4         3s  3.400s       right
5     3.400s  3.500s         now
6     3.500s  3.800s           I
7     3.800s  4.300s        help

Time           word
1.900s         hey
2.000s         hey
2.100s         hey
2.200s         hey
2.300s         I'm
2.400s         I'm
2.500s         I'm
2.600s         I'm
2.700s         I'm
2.800s         John
2.900s         John
3.000s         right
3.100s         right
3.200s         right
3.300s         right

一个解决方案可以使用 tidyr::expand

已编辑: 根据 OP 的反馈,他的数据重复了 startTime

library(tidyverse)
step = 0.1
df %>% group_by(rnum = row_number()) %>%
  expand(Time = seq(startTime, max(startTime, (endTime-step)), by=step), word = word) %>%
  arrange(Time) %>% 
  ungroup() %>%
  select(-rnum)

# # A tibble: 24 x 2
# # Groups: word [7]
#    Time word 
#   <dbl> <chr>
# 1  1.90 hey  
# 2  2.00 hey  
# 3  2.10 hey  
# 4  2.20 hey  
# 5  2.30 I'm  
# 6  2.40 I'm  
# 7  2.50 I'm  
# 8  2.60 I'm  
# 9  2.70 I'm  
# 10  2.80 John
# ... with 14 more rows

数据

df <- read.table(text = 
"startTime endTime           word
     1.900  2.300         hey
     2.300  2.800         I'm
     2.800      3        John
     3      3.400       right
     3.400  3.500         now
     3.500  3.800           I
     3.800  4.300        help",
header = TRUE, stringsAsFactors = FALSE)

dcast() 用于将数据从长格式重塑为宽格式(从而聚合),而 OP 希望从宽格式重塑为长格式从而填充缺失的时间戳。

还有一种替代方法,它使用 非相等连接

准备数据

但是,startTimeendTime需要在去掉尾部的"s"后转为数值变量才能继续。

library(data.table)
cols <- stringr::str_subset(names(DF), "Time$")
setDT(DF)[, (cols) := lapply(.SD, function(x) as.numeric(stringr::str_replace(x, "s", ""))), 
          .SDcols = cols]

非同等加入

创建了涵盖整个时期的时间戳序列并将其正确连接到数据集,但仅保留给定时间间隔内的那些时间戳。从接受的答案来看, endTime 似乎不能包含在结果中。因此,必须相应地调整连接条件。

DF[DF[, CJ(time = seq(min(startTime), max(endTime), 0.1))], 
   on = .(startTime <= time, endTime > time), nomatch = 0L][
     , endTime := NULL][]   # a bit of clean-up
    startTime  word
 1:       1.9   hey
 2:       2.0   hey
 3:       2.1   hey
 4:       2.2   hey
 5:       2.3   I'm
 6:       2.4   I'm
 7:       2.5   I'm
 8:       2.6   I'm
 9:       2.7   I'm
10:       2.8  John
11:       2.9  John
12:       3.0 right
13:       3.1 right
14:       3.2 right
15:       3.3 right
16:       3.4   now
17:       3.5     I
18:       3.6     I
19:       3.7     I
20:       3.8  help
21:       3.9  help
22:       4.0  help
23:       4.1  help
24:       4.2  help
    startTime  word

请注意,此方法不需要引入行号。

nomatch = 0L 在对话中出现空白时避免 NA 行。

数据

library(data.table)
DF <- fread("
rn startTime endTime           word
1     1.900s  2.300s         hey
2     2.300s  2.800s         I'm
3     2.800s      3s        John
4         3s  3.400s       right
5     3.400s  3.500s         now
6     3.500s  3.800s           I
7     3.800s  4.300s        help
", drop = 1L)