我有一些潮汐数据,我想根据深度分配一个字符变量。
我想在df1$t_depth
列中将Flood
分为Ebb
,Slack
或df1$p_wave
。
这是我的数据示例。
datetime t_depth
1 23/03/2018 22:59 0.7200000
2 23/03/2018 23:59 0.8652785
3 24/03/2018 00:59 1.0105569
4 24/03/2018 01:59 1.1558354
5 24/03/2018 02:59 1.3011138
6 24/03/2018 03:59 1.4463923
7 24/03/2018 05:52 1.7200000
8 24/03/2018 06:52 1.5875325
9 24/03/2018 07:52 1.4550649
10 24/03/2018 08:52 1.3225974
11 24/03/2018 09:52 1.1901299
12 24/03/2018 10:52 1.0576623
13 24/03/2018 12:17 0.8700000
14 24/03/2018 13:17 0.9723256
15 24/03/2018 14:17 1.0746512
16 24/03/2018 15:17 1.1769767
17 24/03/2018 16:17 1.2793023
18 24/03/2018 17:17 1.3816279
19 24/03/2018 18:44 1.5300000
20 24/03/2018 19:44 1.4452542
21 24/03/2018 20:44 1.3605085
22 24/03/2018 21:44 1.2757627
23 24/03/2018 22:44 1.1910169
24 25/03/2018 00:38 1.0300000
对于df1$p_wave
,我想将最高潮汐归类为Flood
,将最低潮汐归类为Ebb
,中间的每个潮汐都归为Slack
。但是,潮汐期的长度不尽相同,整个时期的最高值和最低值也会发生变化。我不确定如何根据这些变化的条件对这些值进行分类的最佳方法。
我认为我可以使用df1$datetime
来做到这一点,因为分钟数随每个潮汐期而变化,因此,在新潮汐期开始时,较低的数字为Ebb
,较高的数字为{{ 1}},但我不确定有效地编写此代码的方法。
我希望能够重现涵盖多天的数据集。
Flood
任何帮助将不胜感激!
数据:
datetime t_depth p_wave
1 23/03/2018 22:59 0.7200000 Ebb
2 23/03/2018 23:59 0.8652785 Slack
3 24/03/2018 00:59 1.0105569 Slack
4 24/03/2018 01:59 1.1558354 Slack
5 24/03/2018 02:59 1.3011138 Slack
6 24/03/2018 03:59 1.4463923 Slack
7 24/03/2018 05:52 1.7200000 Flood
8 24/03/2018 06:52 1.5875325 Slack
9 24/03/2018 07:52 1.4550649 Slack
10 24/03/2018 08:52 1.3225974 Slack
11 24/03/2018 09:52 1.1901299 Slack
12 24/03/2018 10:52 1.0576623 Slack
13 24/03/2018 12:17 0.8700000 Ebb
14 24/03/2018 13:17 0.9723256 Slack
15 24/03/2018 14:17 1.0746512 Slack
16 24/03/2018 15:17 1.1769767 Slack
17 24/03/2018 16:17 1.2793023 Slack
18 24/03/2018 17:17 1.3816279 Slack
19 24/03/2018 18:44 1.5300000 Flood
20 24/03/2018 19:44 1.4452542 Slack
21 24/03/2018 20:44 1.3605085 Slack
22 24/03/2018 21:44 1.2757627 Slack
23 24/03/2018 22:44 1.1910169 Slack
24 25/03/2018 00:38 1.0300000 Ebb
答案 0 :(得分:4)
从微积分中我们知道,一阶导数会改变其局部最小值和最大值的符号。在离散情况下也是如此。这样我们就可以计算导数并检查其符号是否发生变化。
找到更改的最简单方法是再次区分符号向量。对于Flood,该值为-2,对于Ebb为+2。
diff(sign(diff(df1$t_depth)))
#> [1] 0 0 0 0 0 -2 0 0 0 0 0 2 0 0 0 0 0 -2 0 0 0 0
请注意,您无法使用此方法识别第一行和最后一行的状态。但是很明显,您永远都不知道第一行和最后一行的状态,因为您不知道水是否在上升。
df1$p_wave <- c(NA, diff(sign(diff(df1$t_depth))), NA)
df1$p_wave <- cut(df1$p_wave, breaks = c(-3, -1, 1, 3), labels = c("Flood", "Slack", "Ebb"))
df1
datetime t_depth p_wave
1 23/03/2018 22:59 0.7200000 <NA>
2 23/03/2018 23:59 0.8652785 Slack
3 24/03/2018 00:59 1.0105569 Slack
4 24/03/2018 01:59 1.1558354 Slack
5 24/03/2018 02:59 1.3011138 Slack
6 24/03/2018 03:59 1.4463923 Slack
7 24/03/2018 05:52 1.7200000 Flood
8 24/03/2018 06:52 1.5875325 Slack
9 24/03/2018 07:52 1.4550649 Slack
10 24/03/2018 08:52 1.3225974 Slack
11 24/03/2018 09:52 1.1901299 Slack
12 24/03/2018 10:52 1.0576623 Slack
13 24/03/2018 12:17 0.8700000 Ebb
14 24/03/2018 13:17 0.9723256 Slack
15 24/03/2018 14:17 1.0746512 Slack
16 24/03/2018 15:17 1.1769767 Slack
17 24/03/2018 16:17 1.2793023 Slack
18 24/03/2018 17:17 1.3816279 Slack
19 24/03/2018 18:44 1.5300000 Flood
20 24/03/2018 19:44 1.4452542 Slack
21 24/03/2018 20:44 1.3605085 Slack
22 24/03/2018 21:44 1.2757627 Slack
23 24/03/2018 22:44 1.1910169 Slack
24 25/03/2018 00:38 1.0300000 <NA>
编辑:您可以像这样添加“下降”和“上升”状态:
df1$p_wave <- c(NA, diff(sign(diff(df1$t_depth))), NA)
df1$p_wave[!is.na(df1$p_wave) & df1$p_wave == 0] <- sign(diff(df1$t_depth))[!is.na(df1$p_wave) & df1$p_wave == 0]
df1$p_wave <- cut(df1$p_wave,
breaks = c(-2.5, -1.5, 0, 1.5, 2.5),
labels = c("Flood", "Falling", "Rising", "Ebb"))