Этот вопрос является продолжением эти отличные ответы.
Из ответа, который я привел выше, можно вычислить из вектора числовых x
, есть ли какая-либо серия из как минимум n
элементов, которые удовлетворяют условию (например, больше 50), где серия of n
элементов заключено между по крайней мере одной серией с каждой стороны по крайней мере m
элементов, которые не удовлетворяют этому же условию (см. сообщение выше для получения дополнительной информации). Моя цель - обобщить эту функцию, чтобы разрешить различные условия для серии элементов n
, чем для серии элементов m
. Ниже я рассматриваю пример одного из двух ответов на связанный пост, но было бы проще изменить функцию из другого ответа, чтобы сделать обобщение.
### 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
элементов, удовлетворяющих условию, заключенному вокруг как минимум одной серии с каждой стороны как минимум m
элементов, удовлетворяющих другое условие . Что-то типа:
runfun2(TFvec = list(x > 50, x < 40), list_n = list(n,m))
Вернет ИСТИНА, если есть хотя бы одна серия из как минимум n
элементов, которые больше 50 в x
, и если эта серия заключена как минимум между двумя сериями (по одной с каждой стороны) как минимум m
элементов меньше 40 в x
.
TFvec
теперь является списком той же длины, что и list_n
. В особом случае, когда элементы списка TFvec
идентичны, runfun2
делает то же самое, что и runfun
. Для простоты можно предположить, что элемент x
никогда не может быть истинным при двух (или более) возможных условиях.
1 ответ
Вот так, наверное:
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
Похожие вопросы
Связанные вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат полностью. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.