「時刻」にインデックスがあり、何らかの値を持つzooオブジェクト(またはdata.frameの場合もあります)があるとします(以下のサンプルデータを参照)。
val
...
2006-08-01 12:00 23
2006-08-01 12:01 24
2006-08-01 12:02 25
2006-08-01 12:03 26
2006-08-01 12:04 27
2006-08-01 12:05 28
2006-08-01 12:06 29
...
2006-08-02 12:00 123
2006-08-02 12:01 124
2006-08-02 12:02 125
2006-08-02 12:03 126
2006-08-02 12:04 127
...
custom.func(vals)
その間隔が発生するたびに、12:01〜12:03(つまり、zoo :: rollapplyに似たもの)からカスタム関数を呼び出したい(呼び出します)ので、この例では毎日です。どうすればいいですか?
注(堅牢性のために、次のエッジケースを考慮することもできますが、必須ではありません)。
custom.func(vals)
ように、日の境界で呼び出されるようにしたい場合はどうすればよいval
ですか?入力がz
、最後の注に記載されているPOSIXctzooオブジェクトであるとします。
のtimes
要素ごとに1つの要素を持ちz
、HH:MMの形式の文字ベクトルを作成します。次にok
、指定された境界値の間にある時間を示す論理を作成します。z[ok]
次にz
、それらの値に縮小されます。最後に、毎日、sum
以下を使用して適用します(必要に応じて他の機能を使用できます)aggregate.zoo
。
times <- format(time(z), "%H:%M")
ok <- times >= "12:01" & times <= "12:03"
aggregate(z[ok], as.Date, sum)
## 2006-08-01 2006-08-02
## 75 375
深夜にまたがる場合のバージョンです。関数に送信される値の順序は元の順序ではありませんが、関数が対称である場合は問題ではないことに注意してください。
times <- format(time(z), "%H:%M")
ok <- times >= "23:58" | times <= "00:12"
aggregate(z[ok], (as.Date(format(time(z))) + (times >= "23:58"))[ok], sum)
## 2006-08-02
## 41
前のコードチャンクは、関数が引数のコンポーネントで対称である場合(mean
およびなどの多くの関数の場合sum
)に機能しますが、関数が対称でない場合は、わずかに異なるアプローチが必要になります。to.sec
HH:MM文字列を数値の秒に変換しto.sec("23:58")
、各POSIXct日時から減算するものを定義します。その場合、z
保持するコンポーネントは、変換時間が「00:14」未満のHH:MM文字列に変換されたコンポーネントです。
to.sec <- function(x) with(read.table(text = x, sep = ":"), 3600 * V1 + 60 * V2)
times <- format(time(z) - to.sec("23:58"), "%H:%M")
ok <- times <= "00:14"
aggregate(z[ok], as.Date(time(z)[ok] - to.sec("23:58")), sum)
## 2006-08-01
## 41
Lines <- "datetime val
2006-08-01T12:00 23
2006-08-01T12:01 24
2006-08-01T12:02 25
2006-08-01T12:03 26
2006-08-01T12:04 27
2006-08-01T12:05 28
2006-08-01T12:06 29
2006-08-01T23:58 20
2006-08-02T00:01 21
2006-08-02T12:00 123
2006-08-02T12:01 124
2006-08-02T12:02 125
2006-08-02T12:03 126
2006-08-02T12:04 127"
library(zoo)
z <- read.zoo(text = Lines, tz = "", header = TRUE, format = "%Y-%m-%dT%H:%M")
非対称コードを改訂し、すべてのコードチャンクを簡素化しました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加