获取一定长度的连续整数的运行并从第一个值中采样

mal*_*ard 5 r vector sequence

我正在尝试创建一个函数,该函数将返回向量子集的第一个整数,以便子集的值是离散的,增加 1,并且具有指定的长度。

例如,使用输入数据 'v' 和指定长度 'l' 为 3:

v <- c(3, 4, 5, 6, 15, 16, 25, 26, 27)
l <- 3
Run Code Online (Sandbox Code Playgroud)

长度为 3 的连续值的可能子向量为:

c(3, 4, 5)
c(4, 5, 6)
c(25, 26, 27)
Run Code Online (Sandbox Code Playgroud)

然后我想随机选择这些向量中的一个并返回第一个/最小的数字,即 3、4 或 25。

Ian*_*ell 3

这是一种使用 base 的方法R

首先,我们创建长度为的所有可能的子向量lengthcumsum接下来,我们根据向量的差值等于 来对向量列表进行子集化1。该is.na测试确保包含的最后一个向量NA也被过滤掉。然后我们将剩余的向量绑定到一个矩阵中并对第一列进行采样。

SampleSequencialVectors <- function(vec, length){
  all.vecs <- lapply(seq_along(vec),function(x)vec[x:(x+(length-1))])
  seq.vec <- all.vecs[sapply(all.vecs,function(x) all(diff(x) == 1 & !is.na(diff(x))))]
  sample(do.call(rbind,seq.vec)[,1],1)
}

replicate(10, SampleSequencialVectors(v, 3))
# [1]  3  4  3  3  4  4 25 25  3 25
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢 tidyverse 类型的方法:

SampleSequencialVectorsPurrr <- function(vec, length){
  vec %>%
    seq_along %>%
    purrr::map(~vec[.x:(.x+(length-1))]) %>%
    purrr::keep(~ all(diff(.x) == 1 & !is.na(diff(.x)))) %>%
    purrr::invoke(rbind,.) %>%
    {sample(.[,1],size = 1)}
}
replicate(10, SampleSequencialVectorsPurrr(v, 3))
 [1]  4 25 25  3 25  4  4  3  4 25
Run Code Online (Sandbox Code Playgroud)