【问题标题】:difftime between rows using dplyr使用 dplyr 的行之间的差异时间
【发布时间】:2014-11-05 11:29:27
【问题描述】:

我正在尝试使用 dplyr 包计算两个相邻行中两个时间戳之间的时间差。代码如下:

    tidy_ex <- function () {

    library(dplyr)

    #construct example data
    data <- data.frame(code = c(10888, 10888, 10888, 10888, 10888, 10888, 
                                    10889, 10889, 10889, 10889, 10889, 10889,
                                    10890, 10890, 10890),
                           station = c("F1", "F3", "F4", "F5", "L5", "L7", "F1",
                                       "F3", "F4", "L5", "L6", "L7", "F1", "F3", "F5"),
                           timestamp = c(1365895151, 1365969188, 1366105495,
                                           1367433149, 1368005216, 1368011698,
                                           1366244224, 1366414926, 1367513240,
                                           1367790556, 1367946420, 1367923973,
                                           1365896546, 1365907968, 1366144207))

    # reformat timestamp as POSIXct
    data$timestamp <- as.POSIXct(data$timestamp,origin = "1970-01-01")

    #create tbl_df
    data2 <- tbl_df(data)

    #group by code and calculate time differences between two rows in timestamp column 
    data2 <- data2 %>%
            group_by(code) %>%
            mutate(diff = c(difftime(tail(timestamp, -1), head(timestamp, -1))))

    data2

    }

代码产生错误信息:

 Error: incompatible size (5), expecting 6 (the group size) or 1

我猜这是因为最后一行的差异产生了 NA(因为没有进一步的相邻行)。然而,difftime/head-tails 方法适用于 plyr 包而不是 dplyr (see this StackOverflow post)

如何使用 dplyr 让它工作?

【问题讨论】:

  • 您可能可以使用lag() 代替差异。如果你使用lag(),行数是N,而不是N-1。
  • diff 的长度为 N-1 尝试mutate(diff = c(0, difftime(tail(timestamp, -1), head(timestamp, -1))))

标签: r plyr dplyr


【解决方案1】:

感谢 Victorp 的建议。我将 mutate 行更改为:

mutate(diff = c(difftime(tail(timestamp, -1), head(timestamp, -1)),0))

(我把0放在最后,所以差值计算将从第一行开始)。

【讨论】:

  • difftime(timestamp, lag(timestamp)) 会简单一点
  • @hadley 假设我们有difftime(lead(timestamp), lag(timestamp))。使用tailhead 会不会更高效?
【解决方案2】:

或者,您可以简单地尝试:

... %>%
mutate(diff = c(0,diff(timestamp)))

或者,如果您想明确指定单位并将列转换为数字以进行其他计算:

... %>%
mutate(diff = c(0,as.numeric(diff(timestamp), units="mins")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-30
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2017-06-03
    相关资源
    最近更新 更多