根据更改的最小值和最大值分配字符列

时间:2019-07-18 11:52:26

标签: r

我有一些潮汐数据,我想根据深度分配一个字符变量。

我想在df1$t_depth列中将Flood分为EbbSlackdf1$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

1 个答案:

答案 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"))