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