r - 计算比较 R 中前三行和后三行的相对度量
问题描述
我正在尝试根据来自各种其他列的一组计算来计算一列(prominence),但我被卡住了。有小费吗?这是一个工作示例数据集,其中包含一组声音s、它们的声能以及start和end_time 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) = start (d) - end (a, b, c) 用于前面 3 个声音,但start (e, f, g) - end (d) 用于后面 3 个声音
- time_dist_energy = time_dist *能量(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
使用这些计算,我想定义一个新列prominence,它将每个片段的能量(在本例中为“d”)与前 3 个声音和后 3 个声音的time_dist_energy进行比较。如果大于则赋值1,否则赋值0。
- 突出= 如果能量(d)> {18, 15, 2, 2, 6, 24} == 1,否则为 0
计算数据帧中每个声音的突出度有很多步骤,我真的被卡住了。非常感谢任何和所有帮助!
解决方案
DF
在最后的注释中使用可重复定义,rollapply
用于创建一个超过 7 个连续行号的窗口,并将其传递给 prominence 以执行指示的计算。
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)