Поскольку в вопросе использовались случайные числа без задания начального числа, оно не воспроизводимо, поэтому мы использовали воспроизводимые данные в примечании в конце.
Для каждой птицы отфильтруйте строки, для которых 20 строк до этой точки имеют средний успех 0,80 или более, а затем верните первую такую строку. На всякий случай, если есть птицы, для которых 0,80 никогда не достигаются, присоединяйтесь к отдельным птицам. Если бы мы были уверены, что каждая птица достигает 0,80, или если мы не возражали, что птицы, которые не достигли 0,80, исключаются из результата, мы могли бы опустить эту строку.
library(dplyr)
library(tibble)
library(tidyr)
library(zoo)
data %>%
group_by(bird) %>%
filter(rollmeanr(success, 20, fill = NA) >= 0.80) %>%
slice(1) %>%
ungroup %>%
select(observation, bird) %>%
right_join(distinct(data["bird"]), by = "bird")
## # A tibble: 3 x 2
## observation bird
## <int> <chr>
## 1 46 a121
## 2 127 b232
## 3 218 c211
Обратите внимание, что результаты slide.funct
в вопросе не верны. Например, мы отмечаем, что
mean(data$success[27:46])
## [1] 0.8
, поэтому 65 в первом ряду ниже не могут быть правильными, и мы видим, что в первом столбце ниже значение 19 слишком велико в каждом случае.
slide.funct(data, 19, 1)
## # A tibble: 3 x 2
## observation bird
## <dbl> <chr>
## 1 65 a121
## 2 146 b232
## 3 237 c211
Примечание
Ввод в воспроизводимой форме - аналогичен вопросу, но добавлен set.seed
.
library(dplyr)
library(tibble)
set.seed(123)
data <- tibble(
bird = rep("a121", 99),
success = sample(c(1,0), 99, replace = TRUE, prob = c(0.7, 0.3)),
visit = 1:99) %>%
bind_rows(tibble(
bird = rep("b232", 99),
success = sample(c(1,0), 99, replace = TRUE, prob = c(0.75, 0.15)),
visit = 1:99)) %>%
bind_rows(tibble(
bird = rep("c211", 99),
success = sample(c(1,0), 99, replace = TRUE, prob = c(0.7, 0.3)),
visit = 1:99)) %>%
mutate(observation = 1:297) %>%
select(observation, everything())