【问题标题】:filtering timestamps in dplyr across multiple years在 dplyr 中过滤多个年份的时间戳
【发布时间】:2021-06-15 07:31:27
【问题描述】:

我有这个简单的数据集,其中时间格式为as.POSIXct(我的数据要大得多,但这应该可以正常工作):

df <- tibble(
  "BirdsID" = c("1234", "1234", "1235", "1236",
                "1236", "1237", "1238", "1239"),
  "Sex" = c("M", "M", "F", "F", "F", "F", "M", "F"),
  "Time" = as.POSIXct(c("2019-03-15", "2020-03-16", "2019-05-23", "2019-06-07", 
                        "2020-04-29", "2021-02-15", "2021-02-16", "2021-01-30"))
)

我想将数据过滤为 2 月 1 日至 7 月 1 日之间的观测值,无论年份如何。我看过其他建议在dplyr::filter 中使用between 的帖子;但是,这些数据跨越 3 年,因此技术上存在三个 filter(between( 参数,每年一个。 dplyr 中是否有我缺少的单行代码或函数?也许为“弹簧”添加一列并从那里子集?任何建议将不胜感激。

【问题讨论】:

    标签: r datetime filter dplyr


    【解决方案1】:

    使用建议的lubridate::month 函数,我得到的答案如下:

    df <- tibble(
      "BirdsID" = c("1234", "1234", "1235", "1236",
                    "1236", "1237", "1238", "1239"),
      "Sex" = c("M", "M", "F", "F", "F", "F", "M", "F"),
      "Time" = as.POSIXct(c("2019-03-15", "2020-03-16", "2019-05-23", "2019-06-07", 
                            "2020-04-29", "2021-02-15", "2021-02-16", "2021-01-30"))
    )
    
    df %>% 
      mutate(Time2 = as.Date(Time)) %>%
      mutate(month = month(Time2)) %>%
      filter(between(month, 2, 7))
    

    有点笨拙,我不得不mutate 两次,但它有效。我可能可以将这些突变组合成一行代码。感谢蒂蒙的回复!尼克

    【讨论】:

      【解决方案2】:

      您可以使用lubridate 包中的month() 函数提取月份。因此,以下内容应该可以完成这项工作:

      df %>%
        filter(lubridate::month(Time) %in% c(2:6))
      

      【讨论】:

      • 当我在我的示例df 上运行它时引发错误,其中Error: Problem with filter()` 输入..1。 ` 更重要的是,我的真实数据有 >500,000 个观察值,因此在这种情况下按行索引对我不起作用。我从来没有使用过lubridate::month()!对此的一些变化可能会起作用。
      • 这个例子对我有用df。您是否正在使用 dplyr 包中的 filter() 函数?我正在使用 dplyr 1.0.4 和 lubridate 1.7.9.2。您是否可以先尝试创建一个新变量,即mutate(Month = lubridate::month(Time)) %&gt;% filter(Month %in% c(2:6))?这对我来说产生了相同的结果(带有附加变量)。为什么使用filter() 按行索引不适用于> 500k 的观察?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      相关资源
      最近更新 更多