Другой вариант:
dat <- structure(list(date = c("01/01/2000", "01/01/2000", "01/01/2000",
"01/01/2000", "01/01/2000", "01/01/2000", "01/01/2000", "01/01/2000",
"01/01/2000", "01/01/2000", "01/01/2000", "01/01/2000"),
time = c("08:00", "09:00", "10:00", "11:00", "12:00", "13:00", "14:00",
"15:00", "16:00", "17:00", "18:00", "19:00"), value = c("10", "30", "43",
"55", "59", "45", "10", "15", "43", "45", "60", "10")),
.Names = c("date", "time", "values"), row.names = c(NA, -12L),
class = "data.frame")
run <- rle(dat$value > 40)
dat$exceeds <- rep(run$values, run$lengths)
dat$duration <- rep(run$lengths, run$lengths)
starts <- dat[head(c(1, cumsum(run$length) + 1), length(run$length)),]
result <- subset(starts, duration > 1 & exceeds)
result[, c(1, 2, 5)]
date time duration
3 01/01/2000 10:00 4
9 01/01/2000 16:00 3