比方说,我在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](如果可能的话)开始
此解决方案用于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)