【问题标题】:R Difference in time between rowsR 行之间的时间差
【发布时间】:2018-05-12 05:36:31
【问题描述】:

我已经从以下代码的其他 SO 答案中对信息进行了三角测量,但遇到了错误消息。搜索了类似的错误和解决方案,但无法弄清楚,因此感谢您的帮助。

对于每个组(“id”),我想获取连续行的开始时间之间的差异。

可重现的数据:

require(dplyr)
df <-data.frame(id=as.numeric(c("1","1","1","2","2","2")), 
            start= c("1/31/17 10:00","1/31/17 10:02","1/31/17 10:45", 
                             "2/10/17 12:00", "2/10/17 12:20","2/11/17 09:40"))
time <- strptime(df$start, format = "%m/%d/%y %H:%M")
df %>%
group_by(id)%>%
mutate(diff = time - lag(time),
     diff_mins = as.numeric(diff, units = 'mins'))

让我出错:

mutate_impl(.data, dots) 中的错误: 列diff 的长度必须为 3(组大小)或 1,而不是 6 另外:警告信息: 在 unclass(time1) - unclass(time2) : 较长的对象长度不是较短对象长度的倍数

【问题讨论】:

    标签: r dplyr difftime


    【解决方案1】:

    你的意思是这样的吗?

    这里不需要lag,在分组times 上一个简单的diff 就足够了。

    df %>%
        mutate(start = as.POSIXct(start, format = "%m/%d/%y %H:%M")) %>%
        group_by(id) %>%
        mutate(diff = c(0, diff(start)))
    ## A tibble: 6 x 3
    ## Groups:   id [2]
    #     id start                diff
    #  <dbl> <dttm>              <dbl>
    #1    1. 2017-01-31 10:00:00    0.
    #2    1. 2017-01-31 10:02:00    2.
    #3    1. 2017-01-31 10:45:00   43.
    #4    2. 2017-02-10 12:00:00    0.
    #5    2. 2017-02-10 12:20:00   20.
    #6    2. 2017-02-11 09:40:00 1280.
    

    【讨论】:

    • 效果很好,@Maurits。非常感谢您的帮助。
    • 唯一的问题是“0”,因为每个组的第一个条目会导致分析出现问题。有什么方法可以使这些 NA (我认为 df[which[df ==0)
    • @Bananas 我还是会说不需要lag(和difftime);使用简单的diff 应该更快。只需将c(0, diff(start)) 替换为c(NA, diff(start))
    【解决方案2】:

    您可以使用lagdifftime(根据Hadley):

    df %>%
      mutate(time = as.POSIXct(start, format = "%m/%d/%y %H:%M")) %>%
      group_by(id) %>%
      mutate(diff = difftime(time, lag(time)))
    
    # A tibble: 6 x 4
    # Groups:   id [2]
         id start         time                diff  
      <dbl> <fct>         <dttm>              <time>
    1    1. 1/31/17 10:00 2017-01-31 10:00:00 <NA>  
    2    1. 1/31/17 10:02 2017-01-31 10:02:00 2     
    3    1. 1/31/17 10:45 2017-01-31 10:45:00 43    
    4    2. 2/10/17 12:00 2017-02-10 12:00:00 <NA>  
    5    2. 2/10/17 12:20 2017-02-10 12:20:00 20    
    6    2. 2/11/17 09:40 2017-02-11 09:40:00 1280  
    

    【讨论】:

    • 非常感谢。这对我来说非常有效,因为它将每个组中的第一个作为 NA 处理。
    • 不客气!如果您认为这是您问题的最佳解决方案,请将此答案标记为已接受,方法是单击答案左侧的复选标记。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多