是否有满足条件的一系列“n”元素包裹在满足“x”中另一个条件的两个“m”元素系列之间?
Is there a series of `n` elements that satisfy a condition wrapped betwee two series of `m` elements that satisfy another condition in `x`?
这个问题是 的后续问题。
根据我上面链接的答案,可以从数字 x
的向量中计算是否存在至少 n
个满足条件的元素系列(大于 50示例)其中 n
元素系列被包裹在至少 m
不满足此相同条件的元素的每一侧的至少一个系列之间(有关更多信息,请参见上面的 post信息)。我的目标是概括此函数以允许 n
元素系列与 m
元素系列不同的条件。下面我正在考虑链接 post 的两个答案之一的示例,但修改另一个答案的函数以进行概括可能更容易。
### Function ###
runfun = function(TFvec, list_n, cond=`>=`) {
## setup
n = length(list_n)
r = rle(TFvec); l = r$length
## initial condition
idx = which(cond(l, list_n[1]) & r$value)
idx = idx[idx > n - 1 & idx + n - 1 <= length(l)]
## adjacent conditions
for (i in seq_len(n - 1)) {
if (length(idx) == 0)
break # no solution
thresh = list_n[i + 1]
test = cond(l[idx + i], thresh) & cond(l[idx - i], thresh)
idx = idx[test]
}
## starts = cumsum(l)[idx - 1] + 1
## any luck?
length(idx) != 0
}
### Examples ###
x = c(20, 11, 52, 53, 10, 2, 3, 51, 34, 54, 29)
n = 2
m = 3
runfun(TFvec = x>50, list_n = list(n,m)) # FALSE
x = c(20, 11, 44, 52, 53, 10, 2, 3, 51, 34, 54, 29)
n = 2
m = 3
runfun(TFvec = x>50, list_n = list(n,m)) # TRUE
我现在试图通过允许找到一系列至少 n
的元素来进一步推动这个功能,这些元素满足至少 [=15] 的每一侧至少一个系列的条件=] 满足 另一个条件 的元素。类似于:
runfun2(TFvec = list(x > 50, x < 40), list_n = list(n,m))
如果 x
中至少有一个系列包含至少 n
个大于 50 的元素,并且如果该系列包含在至少两个系列之间,则
会 return 为真(每边一个)至少 m
个小于 40 的元素 x
.
TFvec
现在是一个与 list_n
长度相同的列表。对于 TFvec
列表的元素相同的特殊情况,runfun2
与 runfun
做同样的事情。为简单起见,可以假设 x
的元素在两个(或更多)可能条件下永远不会为真。
像这样,也许:
f<-function(mcond,ncond,m,n){
q<-rep(0,length(mcond))
q[ncond]<-2
q[mcond]<-1
r<-rle(q)
possible<-which(r$values==1
& c(r$values[-1],0)==2
& c(0,head(r$values,-1))==2
)
possible<-possible[r$lengths[possible]>=m &
r$lengths[possible+1]>=n &
r$lengths[possible-1]>=n]
list(start=1+cumsum(r$lengths)[possible-1],length=r$lengths[possible])
}
示例:
> set.seed(123)
> x<-sample(100,300,T)
> f(x>50,x<40,3,2)
$start
[1] 20 294
$length
[1] 9 4
> x[18:30]
[1] 5 33 96 89 70 65 100 66 71 55 60 29 15
> x[292:299]
[1] 11 8 89 76 82 99 11 10
这个问题是
根据我上面链接的答案,可以从数字 x
的向量中计算是否存在至少 n
个满足条件的元素系列(大于 50示例)其中 n
元素系列被包裹在至少 m
不满足此相同条件的元素的每一侧的至少一个系列之间(有关更多信息,请参见上面的 post信息)。我的目标是概括此函数以允许 n
元素系列与 m
元素系列不同的条件。下面我正在考虑链接 post 的两个答案之一的示例,但修改另一个答案的函数以进行概括可能更容易。
### Function ###
runfun = function(TFvec, list_n, cond=`>=`) {
## setup
n = length(list_n)
r = rle(TFvec); l = r$length
## initial condition
idx = which(cond(l, list_n[1]) & r$value)
idx = idx[idx > n - 1 & idx + n - 1 <= length(l)]
## adjacent conditions
for (i in seq_len(n - 1)) {
if (length(idx) == 0)
break # no solution
thresh = list_n[i + 1]
test = cond(l[idx + i], thresh) & cond(l[idx - i], thresh)
idx = idx[test]
}
## starts = cumsum(l)[idx - 1] + 1
## any luck?
length(idx) != 0
}
### Examples ###
x = c(20, 11, 52, 53, 10, 2, 3, 51, 34, 54, 29)
n = 2
m = 3
runfun(TFvec = x>50, list_n = list(n,m)) # FALSE
x = c(20, 11, 44, 52, 53, 10, 2, 3, 51, 34, 54, 29)
n = 2
m = 3
runfun(TFvec = x>50, list_n = list(n,m)) # TRUE
我现在试图通过允许找到一系列至少 n
的元素来进一步推动这个功能,这些元素满足至少 [=15] 的每一侧至少一个系列的条件=] 满足 另一个条件 的元素。类似于:
runfun2(TFvec = list(x > 50, x < 40), list_n = list(n,m))
如果 x
中至少有一个系列包含至少 n
个大于 50 的元素,并且如果该系列包含在至少两个系列之间,则
会 return 为真(每边一个)至少 m
个小于 40 的元素 x
.
TFvec
现在是一个与 list_n
长度相同的列表。对于 TFvec
列表的元素相同的特殊情况,runfun2
与 runfun
做同样的事情。为简单起见,可以假设 x
的元素在两个(或更多)可能条件下永远不会为真。
像这样,也许:
f<-function(mcond,ncond,m,n){
q<-rep(0,length(mcond))
q[ncond]<-2
q[mcond]<-1
r<-rle(q)
possible<-which(r$values==1
& c(r$values[-1],0)==2
& c(0,head(r$values,-1))==2
)
possible<-possible[r$lengths[possible]>=m &
r$lengths[possible+1]>=n &
r$lengths[possible-1]>=n]
list(start=1+cumsum(r$lengths)[possible-1],length=r$lengths[possible])
}
示例:
> set.seed(123)
> x<-sample(100,300,T)
> f(x>50,x<40,3,2)
$start
[1] 20 294
$length
[1] 9 4
> x[18:30]
[1] 5 33 96 89 70 65 100 66 71 55 60 29 15
> x[292:299]
[1] 11 8 89 76 82 99 11 10