Я полагаю, что следующий код выполняет то, что запрашивается. Он использует функцию minutes
из пакета lubridate
для упрощения арифметики даты и времени.
days3 <- lubridate::days(3)
d1 <- a$time_10[1]
d2 <- a$time_10[nrow(a)] - lubridate::days(2)
res <- lapply(seq(d1, d2, by = "1 days"), function(d){
i <- which(d <= a$time_10 & a$time_10 < d + days3)
a[i, ]
})
Edit.
Я нахожу количество строк в каждом кадре данных res
громоздким, что затрудняет проверку того, действительно ли приведенный выше код дает ожидаемый результат. Вот способ проверить это.
check <- lapply(res, function(DF) lubridate::day(DF$time_10))
check <- sapply(check, function(x) rle(x)$values)
head(check, 3)
#[[1]]
#[1] 1 2 3
#
#[[2]]
#[1] 2 3 4
#
#[[3]]
#[1] 3 4 5
rm(check) # tidy up
Данные.
Я опубликую код создания данных, поскольку оригинал не был воспроизводим.
set.seed(8893)
time_10 <- seq(ISOdatetime(2001,2,1,0,0,0), ISOdatetime(2001,3,31,0,0,0), by=(200))
var1 <- runif(length(time_10), min=20, max=70)
var2 <- runif(length(time_10), min=50, max=90)
var3 <- runif(length(time_10), min=50, max=90)
a <- data.frame(time_10, var1, var2, var3)