【问题标题】:Compare dates in a dataframe column with a single date将数据框列中的日期与单个日期进行比较
【发布时间】:2022-01-01 15:34:54
【问题描述】:

我正在尝试将数据框列中每一行的每个日期(查找最大值/最新日期)与单个日期进行比较。 例如:

   date
1  2018-07-31
2  2018-08-01
3  2018-08-02
4  2018-08-03

当我与compare_date="2018-08-02" 进行比较时,它应该输出每行与 compare_date 之间的最新日期。所以新的数据框看起来像这样:

   new_date
1  2018-08-02
2  2018-08-02
3  2018-08-02
4  2018-08-03

我正在尝试使用 sapply 来解决这个问题:

data$new_date <- sapply(data$date,function(x){max(x,compare_date)})

但我得到的输出不是日期格式,像这样:

   date        new_date
1  2018-07-31  17745
2  2018-08-01  17745
3  2018-08-02  17745
4  2018-08-03  17746

请注意,我已使用 as.Date 将 data$date 和 compare_date 转换为 Date 格式。

为什么输出不是日期格式?我是否以错误的方式使用 sapply?

【问题讨论】:

    标签: r date apply lapply sapply


    【解决方案1】:

    R 中有可用的矢量化函数来执行此操作,而不是使用 sapply。在这种情况下,您可以使用pmax -

    df$date <- as.Date(df$date)
    compare_date=as.Date("2018-08-02")
    df$date <- pmax(df$date, compare_date)
    df
    
    #        date
    #1 2018-08-02
    #2 2018-08-02
    #3 2018-08-02
    #4 2018-08-03
    

    数据

    df <- structure(list(date = c("2018-07-31", "2018-08-01", "2018-08-02", 
    "2018-08-03")), class = "data.frame", row.names = c(NA, -4L))
    

    【讨论】:

      【解决方案2】:

      Sapply 以这种方式返回。您可以使用as.vector 找出原因

      as.vector(data$date)
      [1] 17743 17744 17745 17746
      

      使用Reducelapply 会有所帮助

      data$new_date <- Reduce(c,lapply(data$date,function(x){max(x,as.Date("2018-08-02"))}))
      data
      
              date   new_date
      1 2018-07-31 2018-08-02
      2 2018-08-01 2018-08-02
      3 2018-08-02 2018-08-02
      4 2018-08-03 2018-08-03
      

      【讨论】:

        猜你喜欢
        • 2019-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多