2017-08-01 3 views
0

@Uweブロックの助けを借りて解決しました。R data.tableは行を削除します(12月のみ)

R data.table mergeは、毎月のデータセットを1日の観測データセットにマージしようとしているときに、1つのデータセットに月インデックスを戻して12月の観察を削除します。期待どおりに動作するこのマージを行う良い方法は何ですか?

daily[monthly, on=c("year","month"), all=TRUE]の代わりに@Harry Daniels merge(monthly, daily, by=c("year","month"), all=TRUE)のマージを使用すると、すべての1日の観測が正しく保持されますが、1月 - > 0になるように月ごとのデータがシフトされます。

問題:毎月のデータセットで月と年の列を生成すると、あまり正確には整数値ではない月が作成されました。私。 1は実際に0.999999999999091だったので、マージは内部的にフロアを取り、それを相殺しました。 例:日付が数値2016.01,2016.02、...、2016.12として保存された `monthly [、month:= 100 *(Date %% 1)] '

は以下を参照してください。

> monthly 
    year month  CPI 
1: 2016  1 236.916 
2: 2016  2 237.111 
3: 2016  3 238.132 
4: 2016  4 239.261 
5: 2016  5 240.229 
6: 2016  6 241.018 
7: 2016  7 240.628 
8: 2016  8 240.849 
9: 2016  9 241.428 
10: 2016 10 241.729 
11: 2016 11 241.353 
12: 2016 12 241.432 

> daily 
      date year month close 
    1: 2016-01-04 2016  1 2012.66 
    2: 2016-01-05 2016  1 2016.71 
    3: 2016-01-06 2016  1 1990.26 
    4: 2016-01-07 2016  1 1943.09 
    5: 2016-01-08 2016  1 1922.03 
---        
248: 2016-12-23 2016 12 2263.79 
249: 2016-12-27 2016 12 2268.88 
250: 2016-12-28 2016 12 2249.92 
251: 2016-12-29 2016 12 2249.26 
252: 2016-12-30 2016 12 2238.83 

> daily[monthly, on=c("year","month")] 
      date year month close  CPI 
    1:  <NA> 2016  0  NA 236.916 
    2: 2016-01-04 2016  1 2012.66 237.111 
    3: 2016-01-05 2016  1 2016.71 237.111 
    4: 2016-01-06 2016  1 1990.26 237.111 
    5: 2016-01-07 2016  1 1943.09 237.111 
---          
228: 2016-11-23 2016 11 2204.72 241.432 
229: 2016-11-25 2016 11 2213.35 241.432 
230: 2016-11-28 2016 11 2201.72 241.432 
231: 2016-11-29 2016 11 2204.66 241.432 
232: 2016-11-30 2016 11 2198.81 241.432 

> merge(monthly, daily, by=c("year","month"), all=TRUE) 
    year month  CPI close 
    1: 2016  0 236.916  NA 
    2: 2016  1 237.111 2012.66 
    3: 2016  1 237.111 2016.71 
    4: 2016  1 237.111 1990.26 
    5: 2016  1 237.111 1943.09 
---       
249: 2016 12  NA 2263.79 
250: 2016 12  NA 2268.88 
251: 2016 12  NA 2249.92 
252: 2016 12  NA 2249.26 
253: 2016 12  NA 2238.83 
+0

のデータフレームを使用してインデックスに別のデータフレームは良いアイデアのように見えるしていません。 あなたの最善の策は 'merge()'です。 'by = 'month' 'を使ってマージしたいカラムを指定し、' all.x = T'や 'all.y = T'を使ってSQLの外部ジョインを再作成することができます。 – Balter

+2

あなたは毎日[毎月、on = c( "year"、 "month")] 'したいと思う。 – lmo

+0

@Balter data.tablesでは、 'x [i]'は左結合です(...私はそれが呼ばれていると思います)。 "index"表記法は、 'X [Y]'が行列とどのように動作するのかと同様に、 'x'の' i'の各行を検索するので使用されます。 – Frank

答えて

0

これで十分です:

merge(monthly, daily , by = 'month', all = TRUE) 
+1

月単位でのみマージすると、1年以上のデータがあるとどうなりますか? 2016 *と* 2017? – Uwe

+0

@Harry Danielsと@Uweブロックマージ関数を使用すると完全なdata.setが得られますが、月間データは1ヶ月間オフセットされているため、1月は月 '0'になります。 'merge(毎月、毎日、by = c("年 "、"月 ")、すべて= TRUE)' – Millender

関連する問題