我的数据str
为POSIXct
。
对于每次观察,我想在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
答案 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"
范围的极值包含在计数中。 是您问题的正确解决方案吗?