【问题标题】:Count events in range on a vector via iteration in R通过R中的迭代计算向量范围内的事件
【发布时间】:2020-02-18 04:04:42
【问题描述】:

我有一个包含事件标记样本数的向量。它们仅在发现事件时列出,而不是在每个样本中列出。我想获得每秒发现的事件数的输出。采样率已知(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

非常感谢任何帮助!

【问题讨论】:

    标签: r for-loop iteration sampling


    【解决方案1】:

    对于 tidyverse 方法,您可以在 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
    

    【讨论】:

      【解决方案2】:

      您可以使用findInterval/cut查找vec中的元素在哪个范围内,然后使用table统计频率。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-27
        • 2018-04-25
        • 2016-11-23
        • 2021-02-24
        • 1970-01-01
        • 2013-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多