跨多列使用case_when来计算时间差

问题描述 投票:0回答:1

我有一个很大的语音音符数据集,并且正在尝试根据呼叫类型的类型来计算每个音符(行)的持续时间(我在编码领域是一个相当业余的人)。例如:

  note_type call_type begin.time end.time
         1   doublet   314.2205 314.2344
         2   doublet   314.2856 314.3273
         3   squeak    316.2678 316.2799
         1   triplet   316.3476 316.3928
         1   triplet   318.4582 318.4713
         2   triplet   318.5413 318.5853

其中 begin.time 是音符时间的开始,end.time 是音符的结束。我想添加一列计算持续时间,以便: 双连体,持续时间 = note_type2 end.time - note_type1 begin.time 吱吱声,持续时间 = 结束时间 - 开始时间 三连音,持续时间 = 连续第三个音符的结束时间 - “三连音”中第一个音符的开始时间

到目前为止,我已经:

all_notes %>%
  mutate(call_dur = case_when(call_type == "doublet" & note_type == "1" ~ (lead(end.time) - begin.time), 
                              call_type == "squeak" ~ (end.time - begin.time)))

但我不确定如何计算 3 行之间的差异,因为“三元组”调用并不总是具有相同的注释结构(即三元组可以是注释类型 1,1,2 或注释类型 1,2,2 或注释类型 1、2、3 或其任意组合)。

有没有办法计算系列中第三行的结束时间 - 第一个标记为“三连音”的音符的开始时间?

理想情况下,新专栏应如下所示:

  note_type call_type begin.time end.time call_dur
         1   doublet   314.2205 314.2344   0.0139
         2   doublet   314.2856 314.3273   na
         3   squeak    316.2678 316.2799   0.0121
         1   triplet   316.3476 316.3928   2.2377
         1   triplet   318.4582 318.4713   na
         2   triplet   318.5413 318.5853   na
dplyr case
1个回答
0
投票

只需将

n=x
参数添加到
lead()
函数即可使用超过 1 个位置

note_type <- c(1,2,3,1,1,2)
call_type <- c("doublet","doublet","squeak","triplet","triplet","triplet")
begin.time <- c(314.2205,314.2856,316.2678,316.3476,318.4582,318.5413)
end.time <- c(314.2344,314.3273,316.2799,316.3928,318.4713,318.5853)
all_notes <- data.frame(note_type,call_type,begin.time,end.time)

library(dplyr)
all_notes %>%
  mutate(call_dur = case_when(call_type == "doublet" & note_type == "1" ~ (lead(end.time) - begin.time), 
                              call_type == "squeak" ~ (end.time - begin.time),
                              call_type == "triplet" ~ (lead(end.time,n=2) - begin.time),
                              .default = NA
                    )
         )

输出

  note_type call_type begin.time end.time call_dur
1         1   doublet   314.2205 314.2344   0.1068
2         2   doublet   314.2856 314.3273       NA
3         3    squeak   316.2678 316.2799   0.0121
4         1   triplet   316.3476 316.3928   2.2377
5         1   triplet   318.4582 318.4713       NA
6         2   triplet   318.5413 318.5853       NA
© www.soinside.com 2019 - 2024. All rights reserved.