【问题标题】:R data.table merge drops rows (December only)R data.table 合并删除行(仅限 12 月)
【发布时间】:2018-01-08 10:43:09
【问题描述】:

在@Uwe Block 的帮助下解决了。

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

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

问题:在每月数据集上生成月份和年份列会使月份不完全是整数值。 IE。 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

【问题讨论】:

  • 使用一个数据框来索引另一个数据框似乎不是一个好主意。你最好的选择是merge() 函数。您可以使用by = 'month' 指定要合并的列,并使用all.x = Tall.y = T 在SQL 中重新创建外连接。
  • 我想你想要daily[monthly, on=c("year", "month")]
  • @Balter 在 data.tables 中,x[i] 是一个左连接(......我想这就是它的名字)。使用“索引”表示法是因为它在x 中查找i 的每一行,类似于X[Y] 处理矩阵的方式。
  • @Imo 你是对的。我将年份和月份列设置为键,这样它就可以运行了。在再次运行之前,我已经被工作区清除,但 setkey 仍然被执行。但同样的问题。
  • edit 提出您的问题并添加dput(daily)dput(monthly) 的输出。这将有助于重现问题并查看数据中的数据类型。谢谢。

标签: r data.table


【解决方案1】:

这就足够了:

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

【讨论】:

  • 如果只按月合并,如果有超过一年的数据会怎样,例如: 2016 2017?
  • @Harry Daniels 和@Uwe Block 使用合并函数会产生一个完整的data.set,但每月的数据仍会偏移一个月,因此1 月位于“0”月。 merge(monthly, daily, by=c("year","month"), all=TRUE)
猜你喜欢
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 2016-04-22
  • 1970-01-01
  • 2014-05-04
相关资源
最近更新 更多