为了做到这一点,你可能需要一个循环,这意味着如果你有大量的数据,它会有点慢。不过,我试着为您优化如下:
我们先来定义我们的函数
runDays()
:
runDays <- function(dat, x){
offThreshold <- x
dat$run_days <- 0
dat$timediff <- difftime(dat$date_time, lag(dat$date_time), units = "days")
for (i in 2:nrow(dat)){
if (dat$timediff[i] < offThreshold){
dat$run_days[i] <- dat$timediff[i] + dat$run_days[i-1]
}
}
return(dat %>% select(-timediff))
}
runDay(my_df, 1)
但如果你有一个以上的引擎,这就行不通了。因此我们需要另外两个
dplyr
group_by()
和
do()
:
newDat <- my_df %>%
group_by(engine) %>%
do(runDays(., 1))
head(newDat, 15)
# A tibble: 15 x 5
# Groups: engine [1]
engine date_time x y run_days
<fct> <dttm> <dbl> <dbl> <dbl>
1 engine_A 2018-09-03 19:26:29 0.168 0.901 0
2 engine_A 2018-09-03 23:30:33 0.808 0.852 0.169
3 engine_A 2018-09-04 03:34:37 0.385 0.728 0.339
4 engine_A 2018-09-04 07:38:41 0.328 0.737 0.508
5 engine_A 2018-09-04 11:42:45 0.602 -0.352 0.678
6 engine_A 2018-09-04 19:50:53 0.125 1.30 1.02
7 engine_A 2018-09-04 23:54:57 0.295 0.0383 1.19
8 engine_A 2018-09-05 03:59:01 0.578 -0.979 1.36
9 engine_A 2018-09-05 12:07:09 0.512 0.787 1.69
10 engine_A 2018-09-05 20:15:17 0.534 1.70 2.03
11 engine_A 2018-09-06 00:19:21 0.557 -0.795 2.20
12 engine_A 2018-09-06 08:27:30 0.830 -2.27 2.54
13 engine_A 2018-09-06 12:31:34 0.111 -0.162 2.71
14 engine_A 2018-09-07 17:00:02 0.0934 -1.74 0
15 engine_A 2018-09-07 21:04:06 0.237 -1.41 0.169
你可以选择任何你想要的阈值作为你的第二个参数
运行日()
打电话。