Мой последний вопрос (я сделал много за последнее время).
У меня есть df1
, который суммирует различные даты и времени. У меня также есть df2
, который суммирует температуру воды на разных глубинах с течением времени. Я хочу добавить столбец в df1
с именем Term_depth
, показывающий среднюю глубину между двумя последовательными глубинами для определенной даты и времени, ЕСЛИ разница больше 4.5
. Моя проблема заключается в том, что иногда для конкретной даты и времени в df1
есть два интервала в df2
для этой конкретной даты и времени, которые удовлетворяют тому, что они больше, чем 4.5
. В этих ситуациях мне нужна средняя глубина для интервала, который имеет самую низкую температуру на самой большой глубине. То есть, если df2$T15
равно 25, df2$T25
равно 17, а df2$T35
равно 24, меня интересует среднее значение интервала df2$T15
- df2$T25
, поскольку на нижнем уровне значение меньше интервал df2$25
- df2$35
.
Как пример:
df1<- data.frame(DateTime=c("2016-08-01 08:01:17","2016-08-01 09:17:14","2016-08-01 10:29:31","2016-08-01 11:19:02","2016-08-01 12:22:45","2016-08-01 13:19:27","2016-08-01 14:58:17","2016-08-01 15:29:10","2016-08-01 16:27:13"))
df1$DateTime<- as.POSIXct(df1$DateTime, format = "%Y-%m-%d %H:%M:%S", tz= "UTC")
df1$Round_datetime<- round_date(df1$DateTime, unit = "hour")
df2<- data.frame(DateTime=c("2016-08-01 07:00:00","2016-08-01 08:00:00","2016-08-01 09:00:00","2016-08-01 10:00:00","2016-08-01 11:00:00","2016-08-01 12:00:00","2016-08-01 13:00:00","2016-08-01 14:00:00","2016-08-01 15:00:00","2016-08-01 16:00:00","2016-08-01 17:00:00"),T5=c(27.8,27.0,27.5,27.1,27.0,26.8,26.3,26.0,26.3,27.1,26.7),
T15=c(24.2,22.0,23.4,23.1,22.7,22.5,21.5,22.0,22.3,24.4,25.4),T25=c(19.5,21.0,20.0,19.5,19.6,16.0,16.3,16.2,16.7,16.4,23.1),T35=c(17.3,16.0,16.0,16.5,16.7,16.3,16.7,16.9,16.7,21.4,18.2))
df2$DateTime<- as.POSIXct(df2$DateTime, format = "%Y-%m-%d %H:%M:%S", tz= "UTC")
df1
DateTime Round_datetime
1 2016-08-01 08:01:17 2016-08-01 08:00:00
2 2016-08-01 09:17:14 2016-08-01 09:00:00
3 2016-08-01 10:29:31 2016-08-01 10:00:00
4 2016-08-01 11:19:02 2016-08-01 11:00:00
5 2016-08-01 12:22:45 2016-08-01 12:00:00
6 2016-08-01 13:19:27 2016-08-01 13:00:00
7 2016-08-01 14:58:17 2016-08-01 15:00:00
8 2016-08-01 15:29:10 2016-08-01 15:00:00
9 2016-08-01 16:27:13 2016-08-01 16:00:00
df2
DateTime T5 T15 T25 T35
1 2016-08-01 07:00:00 27.8 24.2 19.5 17.3 # One interval bigger than `4.5`
2 2016-08-01 08:00:00 27.0 22.0 21.0 16.0 # Two intervals bigger than `4.5`
3 2016-08-01 09:00:00 27.5 23.4 20.0 16.0 # Zero intervals bigger than `4.5`
4 2016-08-01 10:00:00 27.1 23.1 19.5 16.5 # Zero intervals bigger than `4.5`
5 2016-08-01 11:00:00 27.0 22.7 20.6 15.7 # One interval bigger than `4.5`
6 2016-08-01 12:00:00 26.8 22.5 16.0 16.3 # One interval bigger than `4.5`
7 2016-08-01 13:00:00 26.3 21.5 16.3 21.6 # Three intervals bigger than `4.5`.
8 2016-08-01 14:00:00 26.0 22.0 16.2 16.9 # One interval bigger than `4.5`
9 2016-08-01 15:00:00 26.3 22.3 16.7 16.7 # One interval bigger than `4.5`
10 2016-08-01 16:00:00 27.1 24.4 16.4 21.4 # Two intervals bigger than 4.5
11 2016-08-01 17:00:00 26.7 25.4 23.1 18.2 # One interval bigger than `4.5`
Хотелось бы получить:
df1
DateTime Round_datetime Term_depth
1 2016-08-01 08:01:17 2016-08-01 08:00:00 30
2 2016-08-01 09:17:14 2016-08-01 09:00:00 NA
3 2016-08-01 10:29:31 2016-08-01 10:00:00 NA
4 2016-08-01 11:19:02 2016-08-01 11:00:00 NA
5 2016-08-01 12:22:45 2016-08-01 12:00:00 20
6 2016-08-01 13:19:27 2016-08-01 13:00:00 20
7 2016-08-01 14:58:17 2016-08-01 15:00:00 20
8 2016-08-01 15:29:10 2016-08-01 15:00:00 20
9 2016-08-01 16:27:13 2016-08-01 16:00:00 20
Как я могу это сделать?
Я попробовал цикл for. Проблема в том, что он принимает самый глубокий интервал по умолчанию. Например, df1$Term_depth[6]
или df1$Term_depth[9]
назначаются как 30
вместо 20
.
Здесь у вас есть код и результат с циклом for:
for (i in 1:nrow(df1)) {
if(abs(df2$T35[which(df1$Round_datetime[i] == df2$DateTime)] - df2$T25[which(df1$Round_datetime[i] == df2$DateTime)]) > 4.5){
df1$Term_Depth[i] <- 30
}else if (abs(df2$T25[which(df1$Round_datetime[i] == df2$DateTime)] - df2$T15[which(df1$Round_datetime[i] == df2$DateTime)]) > 4.5){
df1$Term_Depth[i] <- 20
}else if (abs(df2$T15[which(df1$Round_datetime[i] == df2$DateTime)] - df2$T5[which(df1$Round_datetime[i] == df2$DateTime)]) > 4.5){
df1$Term_Depth[i] <- 10
}else{
df1$Term_Depth[i] <- "NA"
}
}
df1
DateTime Round_datetime Term_Depth
1 2016-08-01 08:01:17 2016-08-01 08:00:00 30
2 2016-08-01 09:17:14 2016-08-01 09:00:00 NA
3 2016-08-01 10:29:31 2016-08-01 10:00:00 NA
4 2016-08-01 11:19:02 2016-08-01 11:00:00 NA
5 2016-08-01 12:22:45 2016-08-01 12:00:00 20
6 2016-08-01 13:19:27 2016-08-01 13:00:00 30 # Should be 20
7 2016-08-01 14:58:17 2016-08-01 15:00:00 20
8 2016-08-01 15:29:10 2016-08-01 15:00:00 20
9 2016-08-01 16:27:13 2016-08-01 16:00:00 30 # Should be 20