我正试图根据来自许多其他列的一组计算来计算一列(突出度(,但我被卡住了。有什么建议吗?这是一个工作示例数据集,包含一组声音s、它们的声学能量和开始以及结束时间s。
df <- data.frame("sound" = c("a", "b", "c", "d", "e", "f", "g"),
"energy" = c(4, 5, 2, 26, 2, 1.5, 4),
"start" = c(10, 11, 13, 15, 17, 20, 22),
"end" = c(10.5, 12, 14, 16, 18.5, 21, 23))
我想做的是计算与前3个和后3个声音相比的相对突出度的声音,并进行一些时间惩罚(因此,如果它们在时间上相距太远,它们就不会进入计算(。为此,我需要计算下面描述的几个额外的东西。
我从声音"的角度来说明新的变量;d">,但目的是对数据帧中的每个声音进行这些计算。
需要的新变量:
- time_dist(d(=开始
- time_dist_energy=time_dist*energy(a,b,c,e,f,g(
这些在以下数据帧中详细说明
sound energy start end time_dist time_dist_energy prominence
a 4 10 10.5 15-10.5=4.5 (15-10.5)*4=18
b 5 11 12 15-12=3 (15-12)*5=15
c 2 13 14 15-14=1 (15-14)*2=2
d 26 15 16 NA NA 26 > {18,15,2,2,6,24} = 1
e 2 17 18.5 17-16=1 (17-16)*2=2
f 1.5 20 21 20-16=4 (20-16)*1.5=6
g 4 22 23 22-16=6 (22-16)*4=24
使用这些计算,我想定义一个新的列,突出度,它将每个片段的能量(在这种情况下为"d"(与前3个声音和后3个声音的time_dist_energy进行比较。如果大于,则分配1,否则分配0。
- 突出=如果能量(d(>{18,15,2,2,6,24}==1,否则为0
为数据帧中的每个声音计算突出度的步骤太多了,我真的被卡住了。非常感谢您的帮助!!!
使用末尾注释中可重复定义的DF
,使用rollapply
在7个连续行号上创建一个窗口,并将其突出显示以执行指示的计算。
library(zoo)
prominence <- function(ix, DF) with(DF[ix, ], {
time_dist <- c(start[4] - end[1:3], NA, start[5:7] - end[4])
time_dist_energy <- time_dist * energy
+(energy[4] > max(time_dist_energy[-4]))
})
nr <- nrow(DF)
transform(DF, prominence = rollapply(1:nr, 7, prominence, DF = DF, fill = NA))
给予:
sound energy start end prominence
1 a 4.0 10 10.5 NA
2 b 5.0 11 12.0 NA
3 c 2.0 13 14.0 NA
4 d 26.0 15 16.0 1
5 e 2.0 17 18.5 NA
6 f 1.5 20 21.0 NA
7 g 4.0 22 23.0 NA
备注
Lines <- "sound energy start end
a 4 10 10.5
b 5 11 12
c 2 13 14
d 26 15 16
e 2 17 18.5
f 1.5 20 21
g 4 22 23"
DF <- read.table(text = Lines, header = TRUE)