Подсчет событий в диапазоне на векторе через итерацию в R - PullRequest
1 голос
/ 18 февраля 2020

У меня есть вектор, который содержит номера образцов маркеров событий. Они перечислены только при обнаружении события, а не в каждом образце. Я хотел бы получить вывод о количестве событий, найденных каждую секунду. Частота дискретизации известна (15 Гц).

Я выяснил, как это сделать с помощью для l oop, но он работает немного медленнее. Я изо всех сил пытаюсь найти более эффективный способ выполнить этот расчет (с 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

Любая помощь высоко ценится!

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

При приближении по кругу вы можете map внутри mutate:

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
1 голос
/ 18 февраля 2020

Вы можете использовать findInterval / cut, чтобы найти элемент в vec, в котором находится диапазон, а затем использовать table для подсчета частоты.

table(factor(findInterval(vec, start_idx), levels = seq_along(start_idx)))
#1 2 3 4 
#1 2 0 3 
...