R - 通过值计数识别固定宽度的范围
R - Identifying ranges of fixed width by value count
假设一组有序的 100 个二进制值。使用大小为 10 的 window,我想知道至少包含 x "1s 的那些 windows 的范围(即开始和结束位置) "(例如,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
一个选项是使用width
10执行滚动应用功能或(rollsum
),检查是否有3个1(二进制数据),使用[获取逻辑向量的位置=13=],使用 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')))
这是一个以 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-07-24 创建
假设一组有序的 100 个二进制值。使用大小为 10 的 window,我想知道至少包含 x "1s 的那些 windows 的范围(即开始和结束位置) "(例如,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
一个选项是使用width
10执行滚动应用功能或(rollsum
),检查是否有3个1(二进制数据),使用[获取逻辑向量的位置=13=],使用 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')))
这是一个以 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-07-24 创建