从满足给定条件的数值向量中找出长度为k的连续子向量

rks*_*rks 3 r

比方说,我在R中有一个数字向量

v= c(2,3,5,6,7,6,3,2,3,4,5,7,8,9,6,1,1,2,5,6,7,11,2,3,4)
Run Code Online (Sandbox Code Playgroud)

现在,我必须找到所有大小为4的连续子向量,其条件是子向量的每个元素必须大于2,并且所有子向量必须是不相交的,即非两个子向量可以包含相同的索引元素.所以我的输出将是:

(3,5,6,7),(3,4,5,7),(5,6,7,11)
Run Code Online (Sandbox Code Playgroud)

编辑: 用于说明目的的其他示例:for,

v=c(3,3,3,3,1,3,3,3,3,3,3,3,3) 
Run Code Online (Sandbox Code Playgroud)

输出将是:

(3,3,3,3), (3,3,3,3),(3,3,3,3).
Run Code Online (Sandbox Code Playgroud)

并为

v= c(2,3,5,5,7,6,3,2,3,4,5,7,8,9,6,1,1,2,5,6,7,11,2,3,4) 
Run Code Online (Sandbox Code Playgroud)

输出将是

(3,5,5,7),(3,4,5,7),(5,6,7,11)
Run Code Online (Sandbox Code Playgroud)

输出的第二个条件只是说如果我们发现任何子阵列说(v[m],v[m+1],v[m+2],v[m+3])每个元素大于> 2那么它将进入我的输出而下一个子数组只能从v[m+4](如果可能的话)开始

And*_*rie 5

此解决方案用于embed()创建滞后矩阵,然后从此矩阵中提取所需的行:

v <- c(2,3,5,6,7,6,3,2,3,4,5,7,8,9,6,1,1,2,5,6,7,11,2,3,4)

e <- embed(v, 4)
ret <- which(
  apply(e, 1, function(x)all(x > 2)) &
  apply(e, 1, function(x)length(unique(x)) == 4)
)
rows <- ret[c(1, 1 + which(diff(ret) > 4))]

e[rows, 4:1]

     [,1] [,2] [,3] [,4]
[1,]    3    5    6    7
[2,]    3    4    5    7
[3,]    5    6    7   11
Run Code Online (Sandbox Code Playgroud)