Решение:
library(data.table)
library(lubridate)
library(dplyr)
df1<-data.frame(Datetime=c("2016-08-01 12:34:07","2016-08-01 15:34:07","2016-08-01 16:25:16","2016-08-01 17:29:16","2016-08-01 18:33:16","2016-08-01 19:23:16","2016-08-01 20:01:16","2016-08-01 20:54:16","2016-08-01 22:48:16","2016-08-01 23:48:16","2016-08-02 01:07:16"), Site=c("BD","BD","HG","BD","BD","BD","BD","BD","BD","HG","BD"),Ind=c(16,16,17,19,16,16,17,16,16,17,16), Depth=c(15.50,5.30,24.00,36.40,42.00,25.00,NA,22.10,54.00,27.00,21.50))
df1$Datetime<-as.POSIXct(df1$Datetime, format="%Y-%m-%d %H:%M:%S",tz="UTC")
df1$Datetime_rounded<-round_date(df1$Datetime, "3 hour")
df2<-data.frame(Datetime=c("2016-08-01 12:00:00","2016-08-01 15:00:00","2016-08-01 18:00:00","2016-08-01 21:00:00","2016-08-02 00:00:00"),
Site=c("BD","BD","BD","BD","BD"),
var1=c(2.75,4.00,6.75,2.25,4.30),
var2=c(3.80,7.75,4.75,3.00,2.10),
var3=c(2.20,4.30,6.80,2.25,3.40),
var4=c(5.40,1.10,2.25,3.30,6.50),
var5=c(7.30,5.20,1.30,2.60,1.70))
df2$Datetime<-as.POSIXct(df2$Datetime, format="%Y-%m-%d %H:%M:%S",tz="UTC")
colnames(df2)<-c("Datetime","Site","m0-7","m8-15","m16-23","m24-31","m32-39")
df1<-df1[,c(1,5,2,3,4)] # Rearrange the data frame
setDT(df1) # We convert into data.table
setDT(df2)
setkey(df1, Site, Datetime_rounded) # We indicate the key variables.
setkey(df2, Site, Datetime)
df_merge = df2[df1, roll = -Inf] # Associate one table with the other.
df_merge<-df_merge[,c(8,2,9,10,3:7)] # Rearrange the data.table
df_merge[, Outside_current := case_when(
Site != "BD" ~ "NA",
Depth == "NA" ~ "NA",
Depth < 15 ~ "NA",
Depth >= 15 & Depth < 24 & (`m16-23`*3 < `m24-31` | `m16-23`*3 < `m32-39` | `m16-23`*3 < (`m24-31`+`m32-39`)/2 ) ~ "Yes",
Depth >= 24 & Depth < 32 & (`m24-31`*3 < `m16-23` | `m24-31`*3 < `m32-39` | `m24-31`*3 < (`m16-23`+`m32-39`)/2 ) ~ "Yes",
Depth >= 32 & (`m32-39`*3 < `m16-23` | `m32-39`*3 < `m24-31` | `m32-39`*3 < (`m16-23`+`m24-31`)/2 ) ~ "Yes",
Depth >= 24 & (`m16-23`*3 < `m24-31` | `m16-23`*3 < `m32-39` | `m16-23`*3 < (`m24-31`+`m32-39`)/2 ) ~ "No",
(Depth >= 15 & Depth <24 | Depth >= 32) & (`m24-31`*3 < `m16-23` | `m24-31`*3 < `m32-39` | `m24-31`*3 < (`m16-23`+`m32-39`)/2 ) ~ "No",
Depth < 32 & (`m32-39`*3 < `m16-23` | `m32-39`*3 < `m24-31` | `m32-39`*3 < (`m16-23`+`m24-31`)/2 ) ~ "No",
T ~ "NA")]
> df_merge
i.Datetime Site Ind Depth m0-7 m8-15 m16-23 m24-31 m32-39 Outside_current
1: 2016-08-01 12:34:07 BD 16 15.5 2.75 3.80 2.20 5.40 7.3 Yes
2: 2016-08-01 15:34:07 BD 16 5.3 4.00 7.75 4.30 1.10 5.2 NA
3: 2016-08-01 17:29:16 BD 19 36.4 6.75 4.75 6.80 2.25 1.3 Yes
4: 2016-08-01 18:33:16 BD 16 42.0 6.75 4.75 6.80 2.25 1.3 Yes
5: 2016-08-01 19:23:16 BD 16 25.0 6.75 4.75 6.80 2.25 1.3 Yes
6: 2016-08-01 20:01:16 BD 17 NA 2.25 3.00 2.25 3.30 2.6 NA
7: 2016-08-01 20:54:16 BD 16 22.1 2.25 3.00 2.25 3.30 2.6 NA
8: 2016-08-01 22:48:16 BD 16 54.0 4.30 2.10 3.40 6.50 1.7 Yes
9: 2016-08-02 01:07:16 BD 16 21.5 4.30 2.10 3.40 6.50 1.7 No
10: 2016-08-01 16:25:16 HG 17 24.0 NA NA NA NA NA NA
11: 2016-08-01 23:48:16 HG 17 27.0 NA NA NA NA NA NA