Я искал вокруг, но пока не смог найти решение моего вопроса. Я не совсем уверен, с чего начать.

У меня есть числовой вектор в R. Например:

vec<-c(8,1,2,5,20,1,6,7,13,1,8,1,14,1,1,4,2,7)

Я ищу, чтобы найти индекс, где значение «1» встречается как минимум 3 раза в пределах окна 5. Таким образом, в приведенном выше примере вывод будет «10», как окно, содержащее «1,8,1,14» 1 - это первая последовательность из 5 значений, где 3 значения - это «1», а индекс начала этой последовательности - 10.

Любая помощь была бы признательна.

1
Emma Sylvester 20 Авг 2018 в 18:02

3 ответа

Лучший ответ

Если вы хотите получить только индексы, попробуйте использовать rollapply из пакета zoo:

> library(zoo)
> which(rollapply(vec, 5, FUN=function(x) sum(x==1)>=3))
[1] 10 11 12
1
Jilber Urbina 20 Авг 2018 в 15:25

Попробуйте эту однострочную. Обратите внимание, что каждый из возвращенных 3 индексов удовлетворяет условию.

library(zoo)

which(rollapply(vec, 5, function(x) sum(x == 1) >= 3, fill = FALSE, align = "left"))
## [1] 10 11 12
1
G. Grothendieck 20 Авг 2018 в 15:25
vec<-c(8,1,2,5,20,1,6,7,13,1,8,1,14,1,1,4,2,7)

window=5
numberToFind=1
timesToFind=3
for(i in 1:(length(vec)-window+1)) {
    if(sum(vec[i:(i+window-1)] == numberToFind) == timesToFind) {
        print(i)
        break
    }
}
0
P1storius 20 Авг 2018 в 15:08
51933558