我想根据一系列日期在高潮和低潮时的深度来估算潮汐深度。
date time depth tide_state t_datetime
17/03/2018 20:26 0.43 Low 17/03/2018 20:26
18/03/2018 02:33 2.09 High 18/03/2018 02:33
18/03/2018 08:39 0.45 Low 18/03/2018 08:39
18/03/2018 14:47 2.14 High 18/03/2018 14:47
18/03/2018 20:54 0.41 Low 18/03/2018 20:54
19/03/2018 03:01 2.13 High 19/03/2018 03:01
我将df1$t_datetime
转换为POSIXct。然后,我计算了每次潮汐之间的时间差:
df1 %>%
mutate(diff = c(difftime(tail(t_datetime, -1), head(t_datetime, -1)),0))
这给了我
date time depth tide_state t_datetime diff
17/03/2018 20:26 0.43 Low 2018-03-17 20:26:00 6.116667
18/03/2018 02:33 2.09 High 2018-03-18 02:33:00 6.100000
18/03/2018 08:39 0.45 Low 2018-03-18 08:39:00 6.133333
18/03/2018 14:47 2.14 High 2018-03-18 14:47:00 6.116667
18/03/2018 20:54 0.41 Low 2018-03-18 20:54:00 6.116667
19/03/2018 03:01 2.13 High 2018-03-19 03:01:00 6.133333
df1$diff
以小时为单位。
我想使用df1$diff
来大致计算所列深度之间每小时的潮汐深度。
我认为我需要计算潮汐之间的深度差,然后将其除以df1$diff
,以获得每小时的深度变化。
以前两个为例,深度差为1.66m。这是每小时〜0.27m。
理想情况下,我的输出将如下所示:
date time depth tide_state t_datetime diff
17/03/2018 20:26 0.43 Low 2018-03-17 20:26:00 6.116667
17/03/2018 21:26 0.70 Low 2018-03-17 21:26:00 6.116667
17/03/2018 22:26 0.97 Low 2018-03-17 22:26:00 6.116667
17/03/2018 23:26 1.24 Low 2018-03-17 23:26:00 6.116667
17/03/2018 00:26 1.51 Low 2018-03-17 00:26:00 6.116667
17/03/2018 01:26 1.78 Low 2018-03-17 01:26:00 6.116667
18/03/2018 02:33 2.09 High 2018-03-18 02:33:00 6.100000
由于我只是使用计算器而没有包括所有多余的小数,因此上面的深度略有不足。
我想添加具有新深度的额外行。但是我不确定如何在R中做到这一点,因为并非所有的潮汐期都一样长,而且我正努力知道该怎么做。
任何帮助将不胜感激。
数据:
structure(list(X = 1:6, date = structure(c(1L, 2L, 2L, 2L, 2L,
3L), .Label = c("17/03/2018", "18/03/2018", "19/03/2018"), class = "factor"),
time = structure(c(5L, 1L, 3L, 4L, 6L, 2L), .Label = c("02:33",
"03:01", "08:39", "14:47", "20:26", "20:54"), class = "factor"),
depth = c(0.43, 2.09, 0.45, 2.14, 0.41, 2.13), tide_state = structure(c(2L,
1L, 2L, 1L, 2L, 1L), .Label = c("High", "Low"), class = "factor"),
t_datetime = structure(1:6, .Label = c("2018-03-17 20:26:00",
"2018-03-18 02:33:00", "2018-03-18 08:39:00", "2018-03-18 14:47:00",
"2018-03-18 20:54:00", "2018-03-19 03:01:00"), class = "factor"),
diff = c(6.11666666666667, 6.1, 6.13333333333333, 6.11666666666667,
6.11666666666667, 6.13333333333333)), class = "data.frame", row.names = c(NA,
-6L))
答案 0 :(得分:1)
这听起来像是线性插值问题,向我建议?approx
。
进行一些初始设置:
dat$t_datetime <- as.POSIXct(dat$t_datetime,tz="UTC")
dat$diff <- c(diff(dat$t_datetime),1)
apptimes <- rep(dat$t_datetime, dat$diff) +
as.difftime(sequence(dat$diff)-1, units="hours")
有一个峰值并确保它起作用:
apptimes[1:5]
#[1] "2018-03-17 20:26:00 UTC" "2018-03-17 21:26:00 UTC"
#[3] "2018-03-17 22:26:00 UTC" "2018-03-17 23:26:00 UTC"
#[5] "2018-03-18 00:26:00 UTC"
然后,您可以使用以下app
近似值times
来对depth
值进行线性插值:
approx(x=dat$t_datetime, y=dat$depth, xout=apptimes)$y
#[1] 0.4300000 0.7013896 0.9727793 1.2441689 1.5155586 1.7869482 2.0900000 ...
您可以将所有这些重新组合到您的母带中,然后:
cbind(
dat[rep(seq_len(nrow(dat)),dat$diff), c("X","tide_state")],
t_datetime = apptimes,
depth = approx(x=dat$t_datetime, y=dat$depth, xout=apptimes)$y
)
# X tide_state t_datetime depth
#1 1 Low 2018-03-17 20:26:00 0.4300000
#1.1 1 Low 2018-03-17 21:26:00 0.7013896
#1.2 1 Low 2018-03-17 22:26:00 0.9727793
#1.3 1 Low 2018-03-17 23:26:00 1.2441689
#1.4 1 Low 2018-03-18 00:26:00 1.5155586
#1.5 1 Low 2018-03-18 01:26:00 1.7869482
#2 2 High 2018-03-18 02:33:00 2.0900000
## etc etc
要显示其作用,请执行以下绘图:
plot(dat$t_datetime, dat$depth, xlab="Time", ylab="Depth", col="red", pch=19)
apprdep <- approx(x=dat$t_datetime, y=dat$depth, xout=apptimes)$y
lines(apptimes, apprdep, col="blue", type="o", lty=2)