【问题标题】:Calculate number of days between two dates in r计算r中两个日期之间的天数
【发布时间】:2015-02-27 16:13:35
【问题描述】:

我需要以两种方式计算多个日期之间经过的天数,然后将这些结果输出到新列:i) 与第一个日期相比经过的天数(例如,RESULTS$FIRST)和 ii ) 在连续日期之间(例如,RESULTS$BETWEEN)。这是一个具有所需结果的示例。提前致谢。

library(lubridate)

DATA = data.frame(DATE = mdy(c("7/8/2013",  "8/1/2013", "8/30/2013", "10/23/2013", 
                                   "12/16/2013", "12/16/2015")))

RESULTS  = data.frame(DATE = mdy(c("7/8/2013",  "8/1/2013", "8/30/2013", "10/23/2013", 
                                       "12/16/2013", "12/16/2015")), 
                  FIRST = c(0, 24, 53, 107, 161, 891), BETWEEN = c(0, 24, 29, 54, 54, 730))

【问题讨论】:

    标签: r


    【解决方案1】:
    #Using dplyr package
    library(dplyr)
    df1 %>%  # your dataframe
    mutate(BETWEEN0=as.numeric(difftime(DATE,lag(DATE,1))),BETWEEN=ifelse(is.na(BETWEEN0),0,BETWEEN0),FIRST=cumsum(as.numeric(BETWEEN)))%>%
    select(-BETWEEN0)
                DATE BETWEEN FIRST
        1 2013-07-08       0     0
        2 2013-08-01      24    24
        3 2013-08-30      29    53
        4 2013-10-23      54   107
        5 2013-12-16      54   161
        6 2015-12-16     730   891
    

    【讨论】:

    • 谢谢大家!我应该在问题中提到这一点,但我正在尝试编写灵活的代码(例如,数据集之间的日期数可能会发生变化)并避免 for 循环。因此,尽管所有答案都有效,但 Metrics 答案似乎是最灵活的。再次感谢并保重!
    【解决方案2】:

    这会让你得到你想要的:

    d <- as.Date(DATA$DATE, format="%m/%d/%Y")
    
    first <- c()
    for (i in seq_along(d))
        first[i] <- d[i] - d[1]
    
    between <- c(0, diff(d))
    

    这使用基本包中的as.Date() 函数将字符串日期向量转换为使用给定格式的日期值。由于您的日期为月/日/年,因此您指定 format="%m/%d/%Y" 以确保正确解释它。

    diff() 是滞后差。由于它是滞后的,它不包括元素 1 与其自身之间的差异,因此您可以连接一个 0。

    Date 对象之间的差异默认以天为单位。

    那么构造输出数据框就很简单了:

    RESULTS <- data.frame(DATE=DATA$DATE, FIRST=first, BETWEEN=between)
    

    【讨论】:

      【解决方案3】:

      第一部分:

      DATA = data.frame((c("7/8/2013",  "8/1/2013", "8/30/2013", "10/23/2013","12/16/2013", "12/16/2015")))
      names(DATA)[1] = "V1"
      date = as.Date(DATA$V1, format="%m/%d/%Y")
      print(date-date[1])
      

      结果:

      [1]   0  24  53 107 161 891
      

      对于第二部分 - 只需使用 for 循环

      【讨论】:

        【解决方案4】:

        您可以使用简单的difftime 和滞后的diff 计算来添加每一列。

        DATA$FIRST <- c(0, 
                        with(DATA, 
                             difftime(DATE[2:length(DATE)],DATE[1], unit="days")
                             )
                        )
        DATA$BETWEEN <- c(0, 
                          with(DATA, 
                               diff(DATE[1:(length(DATE) - 1)], unit="days")
                               )
                          )
        
        identical(DATA, RESULTS)
        [1] TRUE
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-29
          • 2015-02-26
          • 2019-09-27
          相关资源
          最近更新 更多