2017-05-29 6 views
1

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 

答えて

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はいコード .POSIXct()を削除するのを忘れたので申し訳ありません。それはas.POSIXct()なしでのみ動作します。 –

+0

これは動作しますが、リテラル日付を一重引用符で囲むことをお勧めします。この場合、H2バックエンドでも動作します。また、たとえyがPOSIXctであっても、H2バックエンドで動作します。 –

関連する問題