Я искал вокруг, но пока не смог найти решение моего вопроса. Я не совсем уверен, с чего начать.
У меня есть числовой вектор в 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.
Любая помощь была бы признательна.
3 ответа
Если вы хотите получить только индексы, попробуйте использовать rollapply
из пакета zoo:
> library(zoo)
> which(rollapply(vec, 5, FUN=function(x) sum(x==1)>=3))
[1] 10 11 12
Попробуйте эту однострочную. Обратите внимание, что каждый из возвращенных 3 индексов удовлетворяет условию.
library(zoo)
which(rollapply(vec, 5, function(x) sum(x == 1) >= 3, fill = FALSE, align = "left"))
## [1] 10 11 12
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
}
}
Похожие вопросы
Новые вопросы
r
R - это свободный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, предоставьте минимальный и воспроизводимый пример (ы) вместе с желаемым результатом. Используйте `dput ()` для данных и укажите все неосновные пакеты с помощью вызовов library (). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов, связанных со статистикой, используйте https://stats.stackexchange.com.