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

时间:2018-04-07 17:53:00

标签: r dataframe dcast

我希望将以下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

2 个答案:

答案 0 :(得分:1)

使用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)

答案 1 :(得分:0)

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)