【问题标题】:Match multiple changing time periods between two datasets匹配两个数据集之间的多个变化时间段
【发布时间】:2019-06-26 18:14:29
【问题描述】:

我有两个数据帧,第一个跨越 3 个月,每 2.5 分钟记录一次深度。

shark depth temperature   datetime    date      location
A     49.5  26.2   20/03/2018 08:00 20/03/2018    SS04
A     49.5  25.3   20/03/2018 08:02 20/03/2018    SS04
A     53.0  24.2   20/03/2018 08:04 20/03/2018    SS04
A     39.5  26.5   20/03/2018 08:32 20/03/2018    Absent
A     43.0  26.2   21/03/2018 09:10 21/03/2018    Absent
A     44.5  26.5   21/03/2018 10:18 21/03/2018    SS04

我有第二个数据框,列出了这三个月的潮汐状态。

   date    time  depth  tide_state   datetime
18/03/2018 02:33  2.09  High    20/03/2018 02:33
18/03/2018 08:39  0.45   Low    20/03/2018 08:39
18/03/2018 14:47  2.14  High    20/03/2018 14:47
18/03/2018 20:54  0.41   Low    20/03/2018 20:54
19/03/2018 03:01  2.13  High    21/03/2019 03:01
19/03/2018 09:09  0.41   Low    21/03/2019 09:09

我想创建一个新数据集,根据每个数据集的日期时间列,为第一个数据集上的所有值插入潮汐状态。例如,如果退潮在 08:39,涨潮在 14:47,我希望 df1 中大于 08:39 但小于 14:47 的每个值都记录为“低潮”,之后的值但是在下一个低潮“高”之前。

由于潮汐时间每天变化三到四次,我不太确定如何在 R 中合并这些。我不确定是否有使用数据的简单方法。桌子?

我将每个数据框中的两个日期时间列都设置为 POSIXct 值。

理想情况下,我想生成一个像这样的数据框的表格:

shark depth temperature   datetime    date    location tide_state
A     49.5  26.2   20/03/2018 08:00 20/03/2018  SS04     High
A     49.5  25.3   20/03/2018 08:02 20/03/2018  SS04     High
A     53.0  24.2   20/03/2018 08:04 20/03/2018  SS04     High
A     39.5  26.5   20/03/2018 08:32 20/03/2018  Absent   Low
A     43.0  26.2   20/03/2018 09:10 21/03/2018  Absent   Low  
A     44.5  26.5   20/03/2018 10:18 21/03/2018  SS04     Low

【问题讨论】:

  • 这有时被称为“非等值连接”,可以使用 SQL、data.table 或模糊连接包。 dplyr rangling 也可以,但我认为它不会那么优雅。
  • 两个数据集有多大?我正在考虑一种方法,但它可能有大小限制。
  • @akash87 第一个数据集有102902个观测值,潮汐数据集有386个

标签: r lubridate


【解决方案1】:

如果数据更大或连接更复杂,我建议使用 SQL 或 data.table 进行非等连接。对于这种大小的数据,您只需要“table2 中的最新值”,我们可以在 dplyr 中使用更简单的方法,我希望它会很快。

# First some housekeeping. It will be useful to have datetimes for sorting
library(dplyr)
df1   <- df1   %>% mutate(datetime = lubridate::dmy_hm(datetime))
tides <- tides %>% mutate(datetime = lubridate::dmy_hm(datetime))

# I collate the two tables, sort by datetime, fill in the tide info, and then remove the tide rows.
df1 %>%
  bind_rows(tides %>% 
     select(datetime, tide_state, tide_depth = depth) %>%
     mutate(tide_row_to_cut = TRUE)) %>%      # EDIT
  arrange(datetime) %>%
  tidyr::fill(tide_depth, tide_state) %>%
  filter(!tide_row_to_cut) %>%                # EDIT
  select(-tide_row_to_cut)                    # EDIT

编辑:在 Temperature 中使用 NA 删除 tide 行的先前版本不适用于原始海报,因此我在潮数据中添加了一个名为 tide_row_to_cut 的明确列,以使修剪步骤更多健壮。

  shark depth temperature            datetime       date location tide_state tide_depth
1     A  49.5        26.2 2018-03-20 08:00:00 20/03/2018     SS04       High       2.09
2     A  49.5        25.3 2018-03-20 08:02:00 20/03/2018     SS04       High       2.09
3     A  53.0        24.2 2018-03-20 08:04:00 20/03/2018     SS04       High       2.09
4     A  39.5        26.5 2018-03-20 08:32:00 20/03/2018   Absent       High       2.09
5     A  43.0        26.2 2018-03-21 09:10:00 21/03/2018   Absent        Low       0.41
6     A  44.5        26.5 2018-03-21 10:18:00 21/03/2018     SS04        Low       0.41

我相信这符合说明,但它与请求的输出略有不同,因为低潮发生在 08:39,即 08:32 读数后几分钟。那时潮水会很低,但还没有达到最大低潮。您可能想寻找“最接近”的潮汐。做到这一点的一种方法是将潮汐时间移回之前的潮汐的一半,或者一个固定的量(例如 2 小时?)。

【讨论】:

  • 谢谢!我的实际 df1 有 102902 个观测值,有 15 个变量。我用这个对其进行了测试,它似乎工作正常,只需要合并我为简单起见而遗漏的变量
  • 我正在努力将其应用于带有额外变量的完整数据集,我不断收到此错误:depth 必须评估为列位置或名称,而不是函数。有没有办法将其作为 data.table 执行,允许我从示例中省略的额外变量?谢谢!
  • 也许您的tides 表没有名为depth 的列?在我的代码中,我将tides 中的depth 列重命名为tide_depth,因此它与原始数据集中的depth 列不同。
  • 我将~~~tides~~~ 表中的~~~depth~~~ 列重命名为~~~tide_depth~~~,并删除了~~~filter(!is. na(temperature))~~~ 部分,因为我的一些数据具有我需要保留的 NA 值。所以我现在正在使用~~~d %>% bind_rows(tide %>% select(datetime,汰渍状态,潮汐深度)) %>%安排(日期时间) %>% tidyr::fill(潮汐深度,潮汐状态)~~~但是现在~~~tide_depth~~~和~~~tide_state~~~的输出都是NA。不太确定我在这里做错了什么。
  • 我认为filter(!is.na(temperature)) 是导致我遇到问题的部分。当包含它时,它工作正常,但我的一些行有温度的 NA 值,我需要包括在内。如果我删除这一行,它会将tides 数据绑定到df1 的顶部,而不合并tide_statetide_depth。抱歉所有问题!
猜你喜欢
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多