假设这是数据:
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的第一个数字。
有什么建议吗?包装
答案 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”的顺序按升序排序您的数据框。接下来,使用滞后函数添加新列以从上一行检索时间值。最后,计算差异。
如果你需要,我可以在以后提供代码,但希望这会给你一些开始的东西。