【发布时间】: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 = T或all.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