我有一个向量,它包含事件标记的样本号。它们只在发现事件时列出,而不是在每个样本中列出。我想获得每秒发现的事件数的输出。采样率已知(15hz(。
我想好了如何使用for循环,但它的运行速度有点慢。我正在努力找出一种更有效的方法来执行这种计算(也许是用mapply或类似的东西?(。有人有什么建议吗?
以下是我正在做的一个示例:
vec <- c(9,20,23,48,50,51)
fs <- 15
start_idx <- seq(from=1,to=46,by=15)
end_idx <- seq(from=15,to=60,by=15)
counter <- vector()
for (i in 1:length(start_idx)) {
counter[i] <- length(which(vec >= start_idx[i] & vec <= end_idx[i]))
}
计数器的结果应该是:
> counter
[1] 1 2 0 3
非常感谢您的帮助!
对于不同的方法,可以在mutate
:中使用map
library(tidyverse)
ranges <- tibble(start_idx, end_idx)
ranges %>%
mutate(ct = map2_int(start_idx, end_idx, ~sum(.x <= vec & .y >= vec)))
start_idx end_idx ct
<dbl> <dbl> <int>
1 1 15 1
2 16 30 2
3 31 45 0
4 46 60 3
您可以使用findInterval
/cut
来查找vec
中的元素位于哪个范围内,然后使用table
来计数频率。
table(factor(findInterval(vec, start_idx), levels = seq_along(start_idx)))
#1 2 3 4
#1 2 0 3