【发布时间】:2015-10-30 05:11:40
【问题描述】:
我有一个多列 xts 对象,它达到第二精度。然后我有另一个 xts 对象,其中包含每天的一个值。我想将该每日值添加为主要 xts 对象中的一列。这是一个例子:
Sys.setenv(TZ = "UTC")
library(xts)
set.seed(777)
xt = xts( data.frame(A=1:20,B=201:220,C=round(runif(20)*10,1)),
order.by = as.POSIXct("2015-06-21") + (runif(20) * 86400 * 14) )
xd = xts( round(runif(14) - 0.5,1), as.Date("2015-06-21") + (1:14))
使用merge 不起作用:xd 条目被赋予“00:00:00”时间戳,因此它们都不匹配,所以我得到一个带有很多 NA 的 xts 对象:
A B C xd
2015-06-21 10:04:36 5 205 7.0 NA
2015-06-22 00:00:00 NA NA NA -0.5
2015-06-23 00:00:00 NA NA NA -0.2
2015-06-23 11:42:38 4 204 10.0 NA
2015-06-24 00:00:00 NA NA NA 0.1
...
预期结果:
A B C xd
2015-06-21 10:04:36 5 205 7.0 NA
2015-06-23 11:42:38 4 204 10.0 -0.2
2015-06-24 21:16:18 18 218 8.7 0.1
2015-06-25 02:30:24 15 215 8.7 -0.2
2015-06-25 07:48:42 16 216 1.0 -0.2
2015-06-25 15:04:34 14 214 5.9 -0.2
2015-06-26 07:50:09 1 201 6.9 -0.3
2015-06-27 19:28:33 7 207 3.5 0.5
...
积分:
- 实际数据会比这个例子大很多,所以要避免过度使用内存和 CPU。
- 如上所示,在 xd 中可能存在 NA 或缺失日期(尽管相对较少)。
-
xt中没有显示某些日子(如上面缺少的 2015-06-22 所示)。我不希望为这样的日子创建条目。 (我想我可以使用na.omit来删除它们,但有可能 - 并且在我的简单示例中没有显示 - 我在数据中有一些我不想删除的真实 NA。)
更新:作为NAs 在原始数据中丢失的示例,请考虑xt[10,'B'] <- NA。使用 Joshua 的 merge(xt, xd, fill=na.locf)[index(xt)] 解决方案,2015-06-28 19:41:45 最终成为 8 203 1.7 0.4 而应该是 8 NA 1.7 0.4。
这是否是一个问题将取决于接下来将使用xt。 FXQuantTrader 的回答显示了一种使用幻数保留NAs 的解决方法,该幻数在最后变回NA。一种替代方法(使用更多内存)是复制任何包含 NA 的列,然后替换整个列。
【问题讨论】:
-
顺便说一句,我的“避免过多的记忆”点与我(简要地)必须使用
na.locf和seq在xd中每秒创建一个条目的想法有关,所以合并将起作用(例如 stackoverflow.com/a/8981517/841830 )这将需要 86,400 行(如果xt使用毫秒则变得更加愚蠢)!