计算比较R中前三行和后三行的相对度量

  • 本文关键字:三行 相对 度量 比较 计算 r dplyr
  • 更新时间 :
  • 英文 :


我正试图根据来自许多其他列的一组计算来计算一列(突出度(,但我被卡住了。有什么建议吗?这是一个工作示例数据集,包含一组声音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)

最新更新