【问题标题】:Convert Speech Start and End Time into Time Series将语音开始和结束时间转换为时间序列
【发布时间】:2018-04-07 17:52:59
【问题描述】:

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

【问题讨论】:

    标签: r dataframe dcast


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

    【讨论】:

    • 我删除了原始文本中的 s,但我收到了一个错误,有什么建议吗? seq.default(startTime, (endTime - step), by = step) 中的错误:'from' 的长度必须为 1
    • group_by(word) 在里面
    • 您使用的数据是否与我在问题中提到的数据完全相同或已更改?如果您使用的是已更改的,那么我需要该信息。也许您可以在该 data.frame 上使用 dput 并作为问题的一部分分享
    • 另一种可能是您的 data.frame 重复了word。就像right 被说了两次。在这种情况下,您需要将group_by 部分更改为group_by(startTime)
    • 您的数据有效,所以它一定是我的结果。再次感谢您的帮助
    【解决方案2】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 2021-01-26
      • 2017-11-04
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多