【问题标题】:R - Identifying ranges of fixed width by value countR - 通过值计数识别固定宽度的范围
【发布时间】:2020-07-24 22:10:20
【问题描述】:

假设有 100 个二进制值的有序集合。使用 10 的窗口大小,我想知道至少包含 x "1s" 的那些窗口的范围(即开始和结束位置)(其中 x =3,例如)。

> set.seed(123456789)
> full=rep(0,100)
> full[sample(1:100, 15)]=1
> split(full, ceiling(seq_along(full)/10))
$`1`
 [1] 0 0 0 0 0 1 0 0 0 0

$`2`
 [1] 0 0 1 0 0 0 0 0 0 0

$`3`
 [1] 0 0 1 0 1 0 0 0 0 0

$`4`
 [1] 0 0 0 0 0 0 0 1 0 0

$`5`
 [1] 0 1 0 0 0 0 0 0 1 0

$`6`
 [1] 0 0 0 0 0 0 0 0 0 0

$`7`
 [1] 0 0 0 0 1 0 1 0 0 1

$`8`
 [1] 0 0 0 0 0 1 0 0 0 0

$`9`
 [1] 0 0 0 0 0 1 1 0 1 0

$`10`
 [1] 0 0 0 0 0 0 0 0 0 1

这就是我要找的东西:

> desired_function(full)
61-70
81-90  

【问题讨论】:

  • 请使用set.seed
  • @akrun 按要求调整
  • 但是,你的输入和我的不一样

标签: r range binning


【解决方案1】:

这是一个以 R 为基础的表达式:

set.seed(123456789)

full <- rep(0,100)
full[sample(1:100, 15)] <- 1
my_list <- split(full, ceiling(seq_along(full)/10))
names(my_list) <- paste(10 * (as.numeric(names(my_list)) - 1) + 1, 
                        10 * (as.numeric(names(my_list)) - 1) + 10,
                        sep = " - ")
names(which(sapply(my_list, function(x) sum(x) == 3)))
#> [1] "21 - 30" "31 - 40"

reprex package (v0.3.0) 于 2020 年 7 月 24 日创建

【讨论】:

    【解决方案2】:

    一种选择是使用width 10 执行滚动应用函数或(rollsum),检查是否有3 个1(二进制数据),使用which 获取逻辑向量的位置,将其转​​换为桶使用cut 并获取桶的unique

    library(zoo)
    unique(cut(which(rollapply(full, 10, function(x) sum(x) == 3)), 
      breaks = c(-Inf, 11, 20, 31, 40, 51, 60), 
          labels = c('11-20', '21-30', '31-40', '41-50', '51-60', '61-70')))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2012-10-03
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多