【问题标题】:Using group_by with difftime将 group_by 与 difftime 一起使用
【发布时间】:2017-10-27 00:27:04
【问题描述】:

我用数据创建了一个数据框:

idCol <- c('1','1','2','2')
stepCol <- c('step1' , 'step2' , 'step1' , 'step2')
timestampCol <- c('01-01-2017:09.00', '01-01-2017:10.00', '01-01-2017:09:00', '01-01-2017:14.00')
mydata <- data.frame(idCol , stepCol , timestampCol)
colnames(mydata) <- c('id' , 'steps' , 'timestamp')

stepCol 是给定 id 的开始时间,当 step2 开始时,这意味着 step1 已经结束。 我正在尝试生成一个 tibble,其中包含基于步骤开始时间的每个 id 的平均持续时间。

所以我正在尝试生成:

step , averagetime
step1 , 1 hour
step2 , 5 hours

我得到的最接近的是:

diffTime <- c(0, difftime(ymd_hms(mydata$timestamp[-1]), ymd_hms(mydata$timestamp[-nrow(mydata)]), units="hours"))
diffTime %>% group_by(id, steps) %>% summarize(mean(diffTime))

但返回错误:

Error in UseMethod("group_by_") : 
  no applicable method for 'group_by_' applied to an object of class "c('double', 'numeric')"

【问题讨论】:

    标签: r


    【解决方案1】:

    我对您的代码做了一些小的编辑,但基本上您需要将ymd_hms 的结果与您的mydata 关联起来:

    mydata$diffTime <- c(0, difftime(lubridate::ymd_hms(mydata$timestamp[-1]), 
                              lubridate::ymd_hms(mydata$timestamp[-nrow(mydata)]), units="hours"))
    diffTime <- mydata %>% group_by(id) %>% summarize(mean(diffTime))
    

    返回:

    R> diffTime
    # A tibble: 2 x 2
         id `mean(diffTime)`
      <chr>            <dbl>
    1     1         0.008333
    2     2         0.033333
    

    【讨论】:

      【解决方案2】:

      请注意,样本数据timestamp 列中的时间命名存在不一致

      timestampCol <- c('01-01-2017:09.00', '01-01-2017:10.00', '01-01-2017:09.00', '01-01-2017:14.00')
      

      将字符串转换为时间值(考虑因素)

      mydata$timestamp <- as.POSIXct(strptime(levels(mydata$timestamp)[mydata$timestamp], format="%m-%d-%Y:%H.%M"))
      
      library(dplyr)
      mydata %>%
        group_by(id) %>%
        mutate(diff = difftime(timestamp, lag(timestamp))) %>%
        summarise(na.omit(diff))
      
      # A tibble: 2 x 2
            id `na.omit(diff)`
        <fctr>          <time>
      1      1         1 hours
      2      2         5 hours
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 2018-06-13
        • 1970-01-01
        • 2021-07-20
        • 2019-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多