首页 > 解决方案 > 计算比较 R 中前三行和后三行的相对度量

问题描述

我正在尝试根据来自各种其他列的一组计算来计算一列(prominence),但我被卡住了。有小费吗?这是一个工作示例数据集,其中包含一组声音s、它们的声以及startend_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"的角度来说明新变量,但目的是对数据帧中的每个声音进行这些计算。

所需的新变量:

这些在以下数据框中进行了详细说明

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。

计算数据帧中每个声音的突出度有很多步骤,我真的被卡住了。非常感谢任何和所有帮助!

标签: rdplyr

解决方案


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)

推荐阅读