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

时间:2015-09-11 19:52:19

标签: r rows closest

假设这是数据:

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的第一个数字。

有什么建议吗?包装

2 个答案:

答案 0 :(得分:3)

嗯它不漂亮,可能不是超级高效,但它似乎完成了工作。我们走了......

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

答案 1 :(得分:1)

如果我了解您要做的事情,我建议您先按照“#number”的顺序按升序排序您的数据框。接下来,使用滞后函数添加新列以从上一行检索时间值。最后,计算差异。

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