2017-05-29 42 views
1

我有的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 

回答

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"))] 
+0

它看起來笨拙,但完美的作品!非常感謝你。 – staove7

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"

該範圍的極值包含在計數。 是您的問題的正確解決方案?

+0

@ G.Grothendieck你已經試過我的代碼?因爲我已經嘗試過,所以它的工作原理! –

+0

@ G.Grothendieck對不起,因爲我忘記了刪除代碼 as.POSIXct()。它只工作沒有as.POSIXct() –

+0

它現在的作品,但我會建議在文字日期周圍使用單引號,在這種情況下,它也可以用於H2後端。即使y是POSIXct,它也可以用於H2後端。 –