2011-12-06 18 views
3
に作成

私はRを使って動物園とクロンを使って時系列解析を行っています。私はその中にたくさんのデータを持つ動物園のオブジェクトを持っており、window関数を使用してデータを1日分だけ、次に価値があるもの、次に価値があるもの、次に次のものにサブセットする必要があります。開始日/終了日の配列をR

I 「その中の一定期間に毎日の日付を持つ配列を作成する最も簡単な方法を見つけることを試みたし、次が出ているVEの:

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年)。しかし、これは私がaeronet動物園のオブジェクトとseの変数の異なる起源を使用しているという警告を与える

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) 
} 

:私は、試してみて、この配列の各要素を使用してforループを行いますデータを選択しません。

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

+1

あなたは何をしようとしているのかは不明ですが、おそらく 'xts :: apply.daily'が役に立ちますか? –

+0

'chron' *と*' zoo'(これは独自の時系列フォーマットを持っています)を使用しているという事実は、あなたのコード/あなたはただ一つでそれらで得ることができますか? (失敗して、 'lubridate'を見てください)。 –

+1

@RichieCotton: 'zoo'には時系列フォーマットはありません。インデックスのクラスに完全に無関係です(つまり、時間ベースである必要はありません)。注文するだけです。 –

答えて

4

我々は、このデータを持っていると仮定:

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

1)骨材 R aggregate機能は、動物園の方法を有しています。第二引数は、私たちが集計するものです。それが関数の場合、それは動物園オブジェクトのインデックスに適用されます。例えばここでは、各日付の平均値を計算します。

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

我々が望むなら私たちは、より複雑な関数でmeanを置き換えることができます。

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

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

ここで(a)はsapply又は(b)そのリストまたは(c)(望まれるどのような処理でprint(zc)を置き換える)以下使用よりlapplyas.Date(time(z))は、zの要素に対応する日付を持つベクトルであること

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

注:ここでzc、すなわち、それはちょうど特定の日付を取ることによって形成された動物園のオブジェクトである、リストの構成要素です。

編集:

さまざまなマイナーエラボレーション。

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" 
... 
+0

このため、 'Sys.Date()+ 0:365'(' + .Date'メソッドを利用する)はもっと簡潔です! –

+0

@ JoshO'Brienニース! –

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") 
) 
) 

今、あなたはsplitを使用して日付してデータを分割、またはplyrからtapplyまたはddplyで各日付に関数を適用(またはaggregateまたは何を使用)することができます。

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

library(plyr) 
ddply(aeronet, .(date), summarise, sum(some.value)) 
関連する問題