2012-01-22 2 views
0

R:各行が1日を表すデータフレームの行に、1年ごとに共通の値を設定するにはどうすればよいですか?各行が1日を表すRデータフレームの行に、1日の1日の共通の値を設定するにはどうすればよいですか?

私は、日付列、価格列、そしてこれらの2つの列から派生した他のさまざまな列からなるデータフレームを持っています。列の1つは、特定の年の各日に対して、その年の初めから価格の変化率(これは以前の質問に関連しています)を計算します。

特定の年の各日に、その年全体の価格の変化率を保持する列を追加したいとします。したがって、価格が2009年の最初の日から最終日まで10%上昇した場合、2009年のすべての日の列は10%(または0.1)の値を保持する必要があります。 2010年の最初と最後の間に価格が2%低下した場合、2010年の各日の列は-0.02という値を保持するはずです。

私がこれまで持っているコードは次のとおりです。

require(lubridate) 
require(plyr) 
# generate data 
set.seed(12345) 
df <- data.frame(date=seq(as.Date("2009/1/1"), by="day", length.out=1115),price=runif(1115, min=100, max=200)) 
# remove weekend days 
df <- df[!(weekdays(as.Date(df$date)) %in% c('Saturday','Sunday')),] 
# add some columns for later 
df$year <- as.numeric(format(as.Date(df$date), format="%Y")) 
df$month <- as.numeric(format(as.Date(df$date), format="%m")) 
df$day <- as.numeric(format(as.Date(df$date), format="%d")) 
df$daythisyear <- as.numeric(format(as.Date(df$date), format="%j")) 
df <- transform(df, doy = as.Date(paste(2000, month, day, sep="/"))) 
df <- ddply(df, .(year), transform, pctchg = ((price/price[1])-1)) 

私は別のデータフレームを使用して、年間(前年比)の変化を得ることができることを実現し、このような何か:

df.yr <- ddply(df, .(year), function(x) (x[nrow(x),2]/x[1,2])-1) 

...しかし、私は年の数字を既存のデータフレームの列に追加する方法を考えることはできません。特に、(4年間のデータで作業している場合)毎年、これらの4つの行を導出するために使用される日次データのデータフレームで約800と比較すると、不一致が生じます。

データフレームの最後の行から開始し、daythisyear列をバックアップしてこれを達成するためにforループを使用するのは簡単です(現在の行のdayisyyearが下の行のdaythisyearより大きい場合は、年には、追加された列などで使用するためにその行から新しい値を取得します)。それにもかかわらず、私は、適用機能またはddplyを使用したRの口頭によるアプローチが必要であると確信しています。したがって、私の質問は次のとおりです。

Q.列の値の年間変化を計算し、その値を新しい列としてその年のすべての行に挿入するにはどうすればよいですか?

+0

ない:私は、このコードは全体の変換だろうと思われますあなたは欲しいですか? – vaettchen

+0

vaettchen、この提案に感謝します。これもうまくいくと思われ、以前私が考慮していなかった「合併」の側面を私に示しました。 – SlowLearner

答えて

2

まだ私はddplyユーザーに変換していません。代わりにaveを使用することをお勧めします。ヘッドが(=「年」で、(DF、df.yrをマージ)) `何を与えるかもしれない`、私はあなたの質問の権利を理解するが、私がしなければかどうか確認してください

df$pctYrChng <- ave(df$price, df$year, FUN=function(x) tail(x,1)/head(x,1) - 1) 
unique(df$pctYrChng) 
#[1] -0.03259032 -0.05781901 0.35932519 0.04246669 
+0

これは、要望どおりに簡単に操作できるように見えます。私は「ave」を漠然と認識していましたが、自分で使っていませんでした。それがベースRで簡単に行えるのなら、私は他の場所を見る必要はないと感じています!ありがとう、ダン – SlowLearner

+0

私はあなたがYTDの変更を望んでいたのか、day.oneからday.lastへの変更を望んでいるのか分かりませんでした。私はあなたに2番目のオプションの解を与えましたが、最初の解は 'tail(x、1)'に 'x'を代入するだけです –

関連する問題