如何在后续行中找到与当前行相比第一个较小的值?
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' 升序排列你的数据框。接下来,使用滞后函数添加一个新列以检索前一行的时间值。最后计算差值。
如果您需要,我可以稍后提供代码,但希望这会给您一些开始的东西。
假设这是数据:
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' 升序排列你的数据框。接下来,使用滞后函数添加一个新列以检索前一行的时间值。最后计算差值。
如果您需要,我可以稍后提供代码,但希望这会给您一些开始的东西。