【问题标题】:Filter a specific range of dates across mult-year data set过滤跨多年数据集的特定日期范围
【发布时间】:2021-12-19 01:32:55
【问题描述】:

我有一个包含多年数据的数据框。我正在尝试过滤这些年份中的每一年的特定日期,但我不确定如何执行此操作。在下面的代码中,我已经过滤了一年的数据,以找出两个不同范围内的数据(即df2 和df3)。我如何修改此代码以适用于我数据集中的所有年份?

我希望代码使用该范围内的所有日期过滤IDs,并且不包含该范围内缺少一天的任何数据。

library(dplyr)
library(lubridate)

ID <-  rep(c("A","B","C", "D"), 5000)
date <-  rep_len(seq(dmy("01-01-2010"), dmy("31-01-2015"), by = "days"), 5000)
x <-  runif(length(date), min = 60000, max = 80000)
y <-  runif(length(date), min = 800000, max = 900000)

df <- data.frame(date = date, 
                 x = x,
                 y =y,
                 ID)


df2 <- df %>% 
  filter(date >= "2010-01-01", date <= "2010-01-31")

df3 <- df %>% 
  filter(date >= "2010-07-01", date <= "2010-07-31")

【问题讨论】:

  • 您是只寻找两个数据集还是每年寻找两个?
  • 每年两次,因此每年将过滤指定日期,从而产生一个包含每年所有指定日期的数据集。
  • 我问的原因是因为它可以是所有年份的两个数据集,而不是多个数据
  • 我想这对我来说可能更容易使用。它会与您提供的答案稍有相同并进行一些修改吗?
  • 那将是创建另一个与年份相同的列,但这也应该考虑到闰年,所以您可以查看我的解决方案中的更新

标签: r dplyr filter lubridate


【解决方案1】:

将“日期”转换为Date 类(ymd),通过year 将group_split 转换为list,然后通过filtering 在创建日期上创建两个数据集make_date,并为每个“年”(嵌套列表)返回一个“df2”和“df3”的list

library(dplyr)
library(lubridate)
library(purrr)
out <- df %>%
      mutate(date = ymd(date)) %>% 
      group_split(yr = year(date), .keep = FALSE) %>% 
      map(~ {
        df2 <- .x %>% 
         filter(date >= make_date(year(first(date)), 1, 1), 
              date <= make_date(year(first(date)), 1, 31))
        df3 <-  .x %>% 
          filter(date >= make_date(year(first(date)), 7, 1),
          date <= make_date(year(first(date)), 7, 31))
    list(df2, df3)
} )

另一种选择是创建另一个与“年份”相同的列(同时考虑 leap 年份)

library(stringr)
df1 <- df %>%
     mutate(date1 = ymd(str_replace(date, '^\\d{4}', '2020'))) 

然后使用 OP 的代码对 'date1' 进行子集化

【讨论】:

    猜你喜欢
    • 2019-05-12
    • 2020-04-10
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多