【问题标题】:Filter between dates using tidyverse lubridate in R在 R 中使用 tidyverse lubridate 过滤日期
【发布时间】:2021-09-27 09:06:11
【问题描述】:

我有一个水位数据集和相关日期。我想做一些非常简单的事情:改变与日期相关的季节的列。

示例数据集:

Watertable date
2          2018-05-03
5          2018-08-01
12         2019-01-03
3          2019-07-29
4          2020-11-09
5          2021-08-22

预期输出:

Watertable date          season
2          2018-05-03    Spring
5          2018-08-01    Summer
12         2019-01-03    Winter
3          2019-07-29    Summer
4          2020-10-09    Fall
5          2021-08-22    Summer

使用lubridate 包将日期转换为“日期”。 我可以通过仅更改月份和日期的额外列并在该列上使用case_when 来创建季节列,但这似乎是一个额外不必要的步骤。

我的问题:我如何使用 mutatecase_when 创建新的“季节”专栏,而不必创建仅包含月份和日期的新专栏。 IE。我想使用 lubridate 来选择省略年份的日期,因为新列仅对日期中的月份和日期值产生影响。

我希望问题很清楚。很高兴在被要求时提供更多信息。

starting dates seasons:
spring = 20 march
summer = 20 june
fall = 22 september
winter = 21 december

【问题讨论】:

    标签: r date tidyverse lubridate


    【解决方案1】:

    一种方法是让所有观测值中的“年份”通用,然后使用case_when

    library(dplyr)
    library(lubridate)
    df %>% 
        mutate(date1 =  as.Date(format(date, '2021-%m-%d')), 
            season = case_when(between(date1, ymd('2021-03-20'), ymd('2021-06-19'))
                 ~ 'Spring',
          between(date1, ymd('2021-06-20'), ymd('2021-09-22'))
             ~ 'Summer', 
         between(date1, ymd('2021-09-22'), ymd('2021-12-21')) ~ 'Fall', 
           TRUE ~ 'Winter'), date1 = NULL)
    

    -输出

     Watertable       date season
    1          2 2018-05-03 Spring
    2          5 2018-08-01 Summer
    3         12 2019-01-03 Winter
    4          3 2019-07-29 Summer
    5          4 2020-11-09   Fall
    6          5 2021-08-22 Summer
    

    数据

    df <- structure(list(Watertable = c(2L, 5L, 12L, 3L, 4L, 5L), date = structure(c(17654, 
    17744, 17899, 18106, 18575, 18861), class = "Date")), row.names = c(NA, 
    -6L), class = "data.frame")
    

    【讨论】:

    • 最好不要管原始数据,而是使用 lubridate 的 yday 提供一年中的数字日期。 case_when(between(yday(date), yday('2021-03-20'), yday('2021-06-19')) ~ 'Spring'
    • 聪明的解决方案将所有年份更改为同一年份。我最终选择了 yday 解决方案,因为这对我来说是最干净的方法。谢谢两位!
    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2023-03-15
    • 2021-11-29
    相关资源
    最近更新 更多