【问题标题】:R: How can I convert a vector of dates to the interval between these dates?R:如何将日期向量转换为这些日期之间的间隔?
【发布时间】:2018-09-10 11:11:26
【问题描述】:

我有一系列日期(它们是类日期)代表某人做某事的日期:

    mytimes = as.Date(c("2014-08-15", "2014-08-29", "2014-08-01", "2014-09-19", "2014-10-31"))

我怎样才能计算这些日期之间的时间,然后还计算日期之间的中位时间?

例如,我可以计算最早日期之后的天数:

    > sort(mytimes) - min(mytimes)
    Time differences in days
    [1]  0 14 28 49 91

但我想得到间隔:0 14 14 21 42

我有一个 data.frame,其中有多个用户/人员,他们每次登录系统时都有一个条目。我想总结一下登录之间的时间间隔。我希望有一些不错的方法来做到这一点......我可以通过计算总时间并除以我的条目数来计算平均时间,但我也想要实际分布、中位数等。理想情况下,我可以使用 dplyr 来汇总按用户分组的数据。

编辑:我刚刚发现了滞后

因此,我可以这样做:

   dataset <- data.frame(ID = c(rep(1, 5), rep(2, 5)), times = rep(mytimes, 2))

    dataset %>% 
     arrange(ID, times) %>%
     group_by(ID) %>%
     mutate(diff_shift = times - lag(times))


# A tibble: 10 x 3
# Groups:   ID [2]
      ID times      diff_shift
   <dbl> <date>     <time>    
 1  1.00 2014-08-01 <NA>      
 2  1.00 2014-08-15 14        
 3  1.00 2014-08-29 14        
 4  1.00 2014-09-19 21        
 5  1.00 2014-10-31 42        
 6  2.00 2014-08-01 <NA>      
 7  2.00 2014-08-15 14        
 8  2.00 2014-08-29 14        
 9  2.00 2014-09-19 21        
10  2.00 2014-10-31 42   

【问题讨论】:

    标签: r


    【解决方案1】:

    使用dplyr,您可以根据您的示例数据执行如下操作。

    但您需要注意,根据您的 data.frame 的外观,您需要添加用户 ID 或更多变量的 group_by

    library(dplyr)
    df <- data_frame(mytimes = as.Date(c("2014-08-15", "2014-08-29", "2014-08-01", "2014-09-19", "2014-10-31")))
    df %>% 
      # group_by(???)
      arrange(mytimes) %>% 
      mutate(time_diff = mytimes - lag(mytimes))
    
      mytimes    time_diff
      <date>     <time>   
    1 2014-08-01 NA       
    2 2014-08-15 14       
    3 2014-08-29 14       
    4 2014-09-19 21       
    5 2014-10-31 42     
    

    【讨论】:

    • 谢谢!我只是在写这篇文章时独立发现了这一点。很有帮助!
    • 不客气。如果有帮助,您可以接受答案。这将有助于在 SO 上建立您的声誉
    【解决方案2】:

    基本的 R 答案只是

    > diff(sort(mytimes))
    Time differences in days
    [1] 14 14 21 42
    > median(diff(sort(mytimes)))
    Time difference of 17.5 days
    

    您可能希望在开头添加一个 0,具体取决于您正在执行的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      相关资源
      最近更新 更多