3

私はRを使用して、zooとchronを使用して時系列分析を行っています。大量のデータを含む動物園オブジェクトがあり、このwindow関数を使用して、データを1日分、次の日数、次の日数などにサブセット化できるようにする必要があります。

特定の期間の毎日の日付を含む配列を作成する最も簡単な方法を見つけようとしましたが、次のことがわかりました。

orig = c(month=1, day=1, year=2005)
dates <- chron(1:1825, origin=orig, out.format=c(dates="d/m/y", times="h:m"))

これはユリウス日表記を使用しており、日付期間の最初の日から1825日(365 * 5-つまり5年)あります。次に、この配列の各要素を使用してforループを実行します。

for (date in dates)
{
  s = chron(date, "00:00:00", origin=orig)
  e = chron(date, "23:59:59", origin=orig)

  aeronet_day = window(aeronet, start=s, end=e)
}

aeronetただし、これにより、 zooオブジェクトとsande変数に異なる原点を使用しており、データが選択されていないという警告が表示されます。

これを行うためのより良い方法はありますか?またはこれを修正する方法は?基本的に私が望むのは、forループを実行することです。このループでは、aeronet_day = window(aeronet, start=s, end=e)コードを使用して、ある日のデータを含むzooオブジェクトを生成できます(たとえば、2005年5月1日00:00:00から23:59:59)。

4

3 に答える 3

4

次のデータがあるとします。

# create test data
library(zoo)
library(chron)
z <- zooreg(1:30, start = chron("2000-01-01"), freq = 2)

1) 集計 Raggregate関数には Zoo メソッドがあります。2 番目の引数は、何によって集計するかです。関数の場合は、zoo オブジェクトのインデックスに適用されます。たとえば、ここでは各日付の平均を計算します。

z.ag <- aggregate(z, as.Date, mean)

mean必要に応じて、より複雑な関数に置き換えることができます。

2) スプリット。Rsplit関数にはzooメソッドがあります。z本当に日付で分割したい場合は、これを行うことができます。以下z.split.listはリストで、各コンポーネントには 1 つの日付の動物園オブジェクトが含まれています。

z.split.list <- split(z, as.Date(time(z)))

次に、(a)sapplyまたは (b)lapplyそのリストに対して、または (c) 以下を使用します (print(zc)必要な処理に置き換えてください)。以下zcはリストの構成要素です。つまり、特定の日付を取得するだけで形成される動物園オブジェクトです。

for(zc in z.split.list) print(zc)

as.Date(time(z))は、z の要素に対応する日付をもつベクトルであることに注意してください。

編集:

さまざまな細かい工夫。

于 2011-12-06T20:21:04.913 に答える
0

私は動物園に詳しくありませんが、通常は日付を数値に変換し、シーケンスを作成してから、再び元に戻します。例えば:

> as.Date(Sys.Date():(Sys.Date()+365), origin='1970-01-01')
  [1] "2011-12-06" "2011-12-07" "2011-12-08" "2011-12-09" "2011-12-10" "2011-12-11" "2011-12-12" "2011-12-13"
  [9] "2011-12-14" "2011-12-15" "2011-12-16" "2011-12-17" "2011-12-18" "2011-12-19" "2011-12-20" "2011-12-21"
 [17] "2011-12-22" "2011-12-23" "2011-12-24" "2011-12-25" "2011-12-26" "2011-12-27" "2011-12-28" "2011-12-29"
 [25] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04" "2012-01-05" "2012-01-06"
 [33] "2012-01-07" "2012-01-08" "2012-01-09" "2012-01-10" "2012-01-11" "2012-01-12" "2012-01-13" "2012-01-14"
 [41] "2012-01-15" "2012-01-16" "2012-01-17" "2012-01-18" "2012-01-19" "2012-01-20" "2012-01-21" "2012-01-22"
...
于 2011-12-06T16:39:41.110 に答える
0

日付ごとに何かをしたい場合は、持っているもので十分です。

いくつかのサンプルaeronetデータ。

last_date <- 1825
n <- 10000
aeronet <- data.frame(
  some.value = seq_len(n), 
  date = as.chron(
    runif(n, 0, last_date), 
    origin = orig,
    out.format = c(dates = "d/m/y", times = "h:m")
  )
)

これで、 を使用して日付ごとにデータを分割したり、またはfrom を使用して(または使用などを使用splitして) 各日付に関数を適用したりできます。tapplyddplyplyraggregate

with(aeronet, split(some.value, date))
with(aeronet, tapply(some.value, date, sum))

library(plyr)
ddply(aeronet, .(date), summarise, sum(some.value))
于 2011-12-06T17:31:04.787 に答える