R data.table合并删除行(仅限12月)

时间:2017-08-01 13:58:38

标签: r data.table

在@Uwe Block的帮助下解决。

R data.table merge通过将月份索引移回一个数据集,同时尝试将月度数据集合并到一组日常观察中,从而降低12月观察值。什么是合并的好方法,按预期工作?

使用合并@Harry Daniels merge(monthly, daily, by=c("year","month"), all=TRUE)代替daily[monthly, on=c("year","month"), all=TRUE]正确保留所有日常观察结果,但每月数据仍然会移动,以便1月 - > 0。

问题:在月度数据集上生成月份和年份列使得月份不完全是整数值。即1实际上是0.999999999999091所以合并在内部发言并抵消它。 示例:`monthly [,month:= 100 *(Date %% 1)]'其中日期存储为数字2016.01,2016.02,...,2016.12。

请参阅以下内容:

> 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

1 个答案:

答案 0 :(得分:0)

这应该足够了:

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