这是使用 dplyr 和的潜在解决方案跑步包:
library(dplyr)
#install.packages("runner")
library(runner)
df1 <- data.frame(time = 1:26, trial = c(NA, NA, NA, 1, NA, NA, NA, 1, NA, NA, NA, 2, NA, NA, NA, 2, NA, NA, NA, NA, 3, NA, NA, NA, 3, NA))
# To fill between every non-NA 'run'
df1 %>%
mutate(trial = runner::fill_run(trial, only_within = TRUE))
#> time trial
#> 1 1 NA
#> 2 2 NA
#> 3 3 NA
#> 4 4 1
#> 5 5 1
#> 6 6 1
#> 7 7 1
#> 8 8 1
#> 9 9 NA
#> 10 10 NA
#> 11 11 NA
#> 12 12 2
#> 13 13 2
#> 14 14 2
#> 15 15 2
#> 16 16 2
#> 17 17 NA
#> 18 18 NA
#> 19 19 NA
#> 20 20 NA
#> 21 21 3
#> 22 22 3
#> 23 23 3
#> 24 24 3
#> 25 25 3
#> 26 26 NA
# To fill between 1's and 2's and leave everything else as is
df1 %>%
mutate(tmp = runner::fill_run(trial, only_within = TRUE)) %>%
transmute(time, trial = ifelse(tmp >= 3 & is.na(trial), NA, tmp))
#> time trial
#> 1 1 NA
#> 2 2 NA
#> 3 3 NA
#> 4 4 1
#> 5 5 1
#> 6 6 1
#> 7 7 1
#> 8 8 1
#> 9 9 NA
#> 10 10 NA
#> 11 11 NA
#> 12 12 2
#> 13 13 2
#> 14 14 2
#> 15 15 2
#> 16 16 2
#> 17 17 NA
#> 18 18 NA
#> 19 19 NA
#> 20 20 NA
#> 21 21 3
#> 22 22 NA
#> 23 23 NA
#> 24 24 NA
#> 25 25 3
#> 26 26 NA
Created on 2022-07-07 by the reprex package (v2.0.1)