如何在后续行中找到与当前行相比第一个较小的值?

How to find the first smaller value compared to the current row in subsequent rows?

假设这是数据:

data<-data.frame(number=c(4,5,3,1,0), 
             datetime=c(as.POSIXct("2015/06/12 12:10:25"),
                        as.POSIXct("2015/06/12 12:10:27"),
                        as.POSIXct("2015/06/12 12:10:32"),
                        as.POSIXct("2015/06/12 12:10:33"),
                        as.POSIXct("2015/06/12 12:10:35")))

  number   datetime
1      4 2015/06/12 12:10:25
2      5 2015/06/12 12:10:27
3      3 2015/06/12 12:10:32
4      1 2015/06/12 12:10:33
5      0 2015/06/12 12:10:35

我想计算一行与下一个较小值之间的时间。期望的输出:

   number  next smaller   time between
1      4              3             7
2      5              3             5
3      3              1             1
4      1              0             2
5      0             NA          NA

示例:3 是后续行中第一个小于 4 的数字。

有什么建议吗?包裹?

嗯,它不是很漂亮,而且效率可能不是很高,但它似乎可以完成工作。我们开始吧...

newcols <- with(data, {
    lapply(seq_along(number), function(i) {
        x <- number[-(1:i)][-i][1]
        c(x, abs(datetime[i] - datetime[number == x])[1])
    })
})

setNames(
    cbind(data[1], do.call(rbind, newcols)), 
    c(names(data)[1], "nextsmallest", "timediff")
)
#   number nextsmallest timediff
# 1      4            3        7
# 2      5            3        5
# 3      3            1        1
# 4      1            0        2
# 5      0           NA       NA

如果我明白你想做什么,我建议你先按 'number' 升序排列你的数据框。接下来,使用滞后函数添加一个新列以检索前一行的时间值。最后计算差值。

如果您需要,我可以稍后提供代码,但希望这会给您一些开始的东西。