【问题标题】:Make condition when one date is greater than the other in R当 R 中的一个日期大于另一个日期时生成条件
【发布时间】:2021-09-08 20:43:47
【问题描述】:

我想根据下面的数据集提出一个条件。我相信if这个条件是可以用的,如果不行,可以换个方式。

我想提出如下条件:

如果我选择的date2 大于date1date1 将始终只是一个日期,正如您在我的df dataset 中看到的那样),计算如下:date2 - date1 + 1 = X -> 这个 X 将是将从我的df dataset 中删除的 DR 列的数量。

我将提供我的df dataset 的代码,然后提供一个示例供您查看。

df <- structure(
  list(date1 = c("2021-06-28","2021-06-28","2021-06-28","2021-06-28","2021-06-28",
       "2021-06-28","2021-06-28","2021-06-28"),
       date2 = c("2021-04-02","2021-04-03","2021-04-08","2021-04-09","2021-04-10","2021-07-01","2021-07-02","2021-07-03"),
       Week= c("Friday","Saturday","Thursday","Friday","Saturday","Thursday","Friday","Monday"),
       DR01_PV = c(4,1,4,3,3,4,3,6), DR02_PV= c(4,2,6,7,3,2,7,4),DR03_PV = c(9,5,4,3,3,2,1,5),
       DR04_PV = c(5,4,3,3,6,2,1,9),DR05_PV = c(5,4,5,3,6,2,1,9),
       DR06_PV = c(2,4,3,3,5,6,7,8),DR07_PV = c(2,5,4,4,9,4,7,8)),
  class = "data.frame", row.names = c(NA, -8L))

 df
   date1      date2       Week      DR01_PV DR02_PV DR03_PV DR04_PV DR05_PV DR06_PV DR07_PV
1 2021-06-28 2021-04-02   Friday       4       4       9       5       5       2       2
2 2021-06-28 2021-04-03 Saturday       1       2       5       4       4       4       5
3 2021-06-28 2021-04-08 Thursday       4       6       4       3       5       3       4
4 2021-06-28 2021-04-09   Friday       3       7       3       3       3       3       4
5 2021-06-28 2021-04-10 Saturday       3       3       3       6       6       5       9
6 2021-06-28 2021-07-01 Thursday       4       2       2       2       2       6       4
7 2021-06-28 2021-07-02   Friday       3       7       1       1       1       7       7
8 2021-06-28 2021-07-03   Monday       6       4       5       9       9       8       8

示例:

如果我选择 01/07 (date2),这是一个大于 date1 (28/06) 的日期,我们有以下内容:

date2 - date1 + 1 = X

01/07 - 28/06 + 1 = 3 + 1 = 4

这4表示我的df dataset会删除前4个DR列,即DR01_PV、DR02_PV、DR03_PV和DR04_PV。我的新数据集 (df1) 将是:

df1
       date1      date2     Week DR05_PV DR06_PV DR07_PV
1 2021-06-28 2021-04-02   Friday       5       2       2
2 2021-06-28 2021-04-03 Saturday       4       4       5
3 2021-06-28 2021-04-08 Thursday       5       3       4
4 2021-06-28 2021-04-09   Friday       3       3       4
5 2021-06-28 2021-04-10 Saturday       6       5       9
6 2021-06-28 2021-07-01 Thursday       2       6       4
7 2021-06-28 2021-07-02   Friday       1       7       7
8 2021-06-28 2021-07-03   Monday       9       8       8

如果我选择 02/07 (date2),这是一个大于 date1 (28/06) 的日期,我们有以下内容:

date2 - date1 + 1 = X

02/07 - 28/06 + 1 = 4 + 1 = 5

这5表示我的df dataset会删除前5个DR列,即DR01_PV、DR02_PV、DR03_PV、DR04_PV和DR05_PV。我的新数据集 (df2) 将是:

df2
       date1      date2     Week DR06_PV DR07_PV
1 2021-06-28 2021-04-02   Friday       2       2
2 2021-06-28 2021-04-03 Saturday       4       5
3 2021-06-28 2021-04-08 Thursday       3       4
4 2021-06-28 2021-04-09   Friday       3       4
5 2021-06-28 2021-04-10 Saturday       5       9
6 2021-06-28 2021-07-01 Thursday       6       4
7 2021-06-28 2021-07-02   Friday       7       7
8 2021-06-28 2021-07-03   Monday       8       8

为了更容易理解,我尝试插入示例。

欢迎任何帮助!

非常感谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    如果我正确理解您的问题,您可以先使用 lubridate 库将日期列转换为日期格式。

    library(lubridate)
    df[, 1:2] = lapply(df[, 1:2], FUN = as_date)
    

    然后是一个辅助函数来计算你所追求的值。

    get_cutoff = function(date) {
      date2 = as_date(date)
      date1 = df[1,1]
      as.numeric(date2 - date1 + 1)
    }
    

    我假设你想重复这个过程,所以我做了一个函数来删除相应的列。参数start_index 是它应该开始删除的任何列,因为它似乎不是第一列。如果日期恰好大于date1 列中的第一个观察值,则返回原始数据框。

    subset_data = function(date, start_index) {
      if (as_date(date) > df[1,1]) {
        end_index = start_index + get_cutoff(date) - 1
        return(df[, -c(start_index:end_index)])
      } else {
        return(df)
      }
    } 
    

    您需要注意您提供的日期格式,但使用“2021-07-02”(起始列索引为 4)会给出:

    subset_data("2021-07-02", 4)
    
           date1      date2     Week DR06_PV DR07_PV
    1 2021-06-28 2021-04-02   Friday       2       2
    2 2021-06-28 2021-04-03 Saturday       4       5
    3 2021-06-28 2021-04-08 Thursday       3       4
    4 2021-06-28 2021-04-09   Friday       3       4
    5 2021-06-28 2021-04-10 Saturday       5       9
    6 2021-06-28 2021-07-01 Thursday       6       4
    7 2021-06-28 2021-07-02   Friday       7       7
    8 2021-06-28 2021-07-03   Monday       8       8
    

    日期为“2021-07-01”:

    subset_data("2021-07-02", 4)
    
           date1      date2     Week DR05_PV DR06_PV DR07_PV
    1 2021-06-28 2021-04-02   Friday       5       2       2
    2 2021-06-28 2021-04-03 Saturday       4       4       5
    3 2021-06-28 2021-04-08 Thursday       5       3       4
    4 2021-06-28 2021-04-09   Friday       3       3       4
    5 2021-06-28 2021-04-10 Saturday       6       5       9
    6 2021-06-28 2021-07-01 Thursday       2       6       4
    7 2021-06-28 2021-07-02   Friday       1       7       7
    8 2021-06-28 2021-07-03   Monday       9       8       8
    

    然后可以适当地修改函数以最适合您的情况。

    编辑:如果您还希望根据输入日期过滤数据行,而不仅仅是列,您可以修改subset_data 函数。这使用了dplyr 包的filter() 函数。

    subset_data = function(date, start_index) {
      date = as_date(date)
      if (date > df[1,1]) {
        end_index = start_index + get_cutoff(date) - 1
        df[, -c(start_index:end_index)] %>%
          filter(date2 == date)
      } else {
        return(df)
      }
    } 
    

    这给出了:

    > subset_data("2021-07-02", 4)
           date1      date2   Week DR06_PV DR07_PV
    1 2021-06-28 2021-07-02 Friday       7       7
    

    但如果值小于date1中的值,会按照要求给出原始数据集。

    【讨论】:

    • @JSouza 在这里回答,而不是其他线程。
    • 感谢卡兹曼!这正是我想要的。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2013-06-24
    • 2016-06-12
    • 2015-11-17
    相关资源
    最近更新 更多