计算时间间隔内的观察次数

时间:2017-05-29 09:17:20

标签: r datetime

我的数据strPOSIXct。 对于每次观察,我想在6和24小时的时间间隔内计算观察之前的观测数量(时间间隔需要灵活)。

这里有一些可重复的例子:

Dat <- data.frame(x=1:5, y=as.POSIXct(c("2017-02-01 16:05:35", "2017-02-01 16:15:35", "2017-02-01 18:15:37", "2017-02-01 23:30:35", "2017-02-02 01:15:35")))

我想获得以下输出:

x v6 v24
1   --  --
2   1   1
3   2   2
4   1   3
5   1   4

2 个答案:

答案 0 :(得分:1)

可能存在更有效的方法,但这应该有效

Dat <- data.frame(x=1:5, y=as.POSIXct(c("2017-02-01 16:05:35", "2017-02-01 16:15:35", "2017-02-01 18:15:37", 
                                    "2017-02-01 23:30:35", "2017-02-01 01:15:35")))

Dat <- Dat[order(Dat[,"y"]),]

require(lubridate)

Dat[,"span6"] <- Dat[,"y"] - hours(6)
Dat[,"span24"] <- Dat[,"y"] - hours(24)

for(s in Dat[,"span6"]){
  Dat[which(Dat[,"span6"]==s),"v6"] <-
    nrow(Dat[which(Dat[,"y"]>=s & Dat[,"y"]<Dat[which(Dat[,"span6"]==s),"y"]),])
}
for(s in Dat[,"span24"]){
  Dat[which(Dat[,"span24"]==s),"v24"] <-
    nrow(Dat[which(Dat[,"y"]>=s & Dat[,"y"]<Dat[which(Dat[,"span24"]==s),"y"]),])
}
Dat <- Dat[,!(names(Dat) %in% c("span6","span24"))]

答案 1 :(得分:1)

您可以尝试library(sqldf)。 我试着用你的数据给你一个简单的例子:

library(sqldf)

Dat <- data.frame(x=1:5, y=c("2017-02-01 16:05:35", "2017-02-01 16:15:35", "2017-02-01 18:15:37", "2017-02-01 23:30:35", "2017-02-01 01:15:35"))

sqldf('select distinct count (x) as count, 
       x
       from Dat 
       where y between "2017-02-01 16:05:35" and "2017-02-01 18:15:35"
       group by x')

输出如下:

  count x
1     1 1
2     1 2

您可以计算

表示的范围内有多少个x值

where y between "2017-02-01 16:05:35" and "2017-02-01 18:15:35"

范围的极值包含在计数中。 是您问题的正确解决方案吗?