Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何将每日xts合并为稀疏时间索引xts?_R_Merge_Xts - Fatal编程技术网

R 如何将每日xts合并为稀疏时间索引xts?

R 如何将每日xts合并为稀疏时间索引xts?,r,merge,xts,R,Merge,Xts,我有一个多列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 *

我有一个多列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”时间戳,因此它们都不匹配,因此我得到一个包含大量NAs的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中,NAs或丢失日期是可能的(尽管相对罕见)
  • xt
    中有一些日期没有表示(如上面缺少的2015-06-22所示)。我不想为这样的日子创建条目。(我想我可以使用
    na.ommit
    删除它们,但有可能(在我的简单示例中没有显示)在我不想删除的数据中有一些真实的NAs。)


<强> Update:< /St>作为原始数据丢失的代码> No>代码>的例子,考虑<代码> xt(10,'b')< p>以获得您想要的,您希望将xd时间戳精确地合并到xd时间戳(到子秒级别)。因此,一种方法是在时区的每个日历日的xt中找到第一个时间戳,并使用该时间戳作为xd中该日的索引值

假设您在交易日开始时(00:00:00)知道xd的值,您可以这样做(如果您仅在交易日结束时知道xd的值,下面的代码需要稍微调整):

Sys.setenv(TZ=“UTC”)
图书馆(xts)
种子(777)
图书馆(lubridate)
xt=xts(数据帧(A=1:20,B=201:220,C=round(runif(20)*10,1)),
order.by=as.POSIXct(“2015-06-21”)+(runif(20)*86400*14))
#使用一致的时间索引顺序(都是POSIXct):
xd=xts(圆形(runif(14)-0.5,1),如POSIXct(“2015-06-21”)+天(1:14))
#由于xd元素每次都是随机创建的:

xd2要获得所需的内容,您需要将xd时间戳完全合并到xd时间戳上(到亚秒级)。因此,一种方法是在时区的每个日历日的xt中找到第一个时间戳,并使用该时间戳作为xd中该日的索引值

假设您在交易日开始时(00:00:00)知道xd的值,您可以这样做(如果您仅在交易日结束时知道xd的值,下面的代码需要稍微调整):

Sys.setenv(TZ=“UTC”)
图书馆(xts)
种子(777)
图书馆(lubridate)
xt=xts(数据帧(A=1:20,B=201:220,C=round(runif(20)*10,1)),
order.by=as.POSIXct(“2015-06-21”)+(runif(20)*86400*14))
#使用一致的时间索引顺序(都是POSIXct):
xd=xts(圆形(runif(14)-0.5,1),如POSIXct(“2015-06-21”)+天(1:14))
#由于xd元素每次都是随机创建的:
xd2我这样做的“规范”方式是:

  • 合并两个对象
  • 对结果调用
    na.locf
  • 子集,使其仅包含所需的索引值
  • 您可以通过
    merge.xts
    函数的
    fill
    参数执行
    na.locf
    调用。例如:

    xtd <- merge(xt, xd, fill=na.locf)[index(xt)]
    
    我这样做的“规范”方式是:

  • 合并两个对象
  • 对结果调用
    na.locf
  • 子集,使其仅包含所需的索引值
  • 您可以通过
    merge.xts
    函数的
    fill
    参数执行
    na.locf
    调用。例如:

    xtd <- merge(xt, xd, fill=na.locf)[index(xt)]
    

    顺便说一句,我的“避免内存过多”的观点与一个想法有关,我(简短地)不得不使用
    na.locf
    seq
    xd
    中每秒创建一个条目,这样合并就可以工作(例如)需要86400行(如果
    xt
    使用毫秒,则会变得更愚蠢)!顺便说一句,我的“避免内存过多”的观点与一个想法有关,我(简短地)不得不使用
    na.locf
    seq
    xd
    中每秒创建一个条目,这样合并就可以工作(例如)需要86400行(如果
    xt
    使用毫秒,则会变得更愚蠢)!谢谢你在回答这个问题时所付出的努力!但肯定不会那么复杂吧?xts索引处理是如此复杂,它肯定会有所帮助。顺便说一句,使用-9999暂时表示NA是相当危险的-您永远不知道代码何时将用于与您目前看到的数据范围不同的数据。(我想说
    -Inf
    NaN
    比-9999更安全,但我认为它们同样容易受到攻击。)关于临时NA替换,您是对的,Inf是一个更干净的选择,并且与NA.locf一起工作。虽然NaN似乎不与na.locf合作。感谢您在回答中所做的努力!但肯定不会那么复杂吧?xts索引处理是如此复杂,它肯定会有所帮助。顺便说一句,使用-9999暂时表示NA是相当危险的-您永远不知道代码何时将用于与您目前看到的数据范围不同的数据。(我想说
    -Inf
    NaN
    比-9999安全,但它们也同样脆弱。)在临时NA替换方面,您是对的,Inf是一个更清洁的选择,并且可以使用NA.locf。虽然NaN似乎不与na.locf.Thank合作,但这很容易。虽然当
    xt
    已经包含了应该保留的
    NA
    值时,它确实会出错(我刚刚编辑了我的问题以显示一个示例)。@DarrenCook:这很容易解决。只需在
    merge
    调用之外执行
    na.locf
    。我将编辑我的答案。谢谢-这很简单。尽管当
    xt
    已经包含
    NA
    值时,它确实会出错
    xtd <- merge(xt, xd, fill=na.locf)[index(xt)]
    
    xtd <- merge(xt, xd)
    xtd[,"xd"] <- na.locf(xtd[,"xd"])
    xtd <- xtd[index(xt)]