r - 为什么 rollapply 内部的 range(index(x)) 的行为与外部不同(仅针对我的人工数据!)

标签 r xts

我本来打算在博客上介绍我制作的一个有用的 R 函数,然后去创建一些虚拟数据,但是虚拟数据的行为不同!救命!

 library(xts)
 data=xts(1:139,Sys.Date()-139:1)

看了一下,一切看起来都不错:

> head(data)
           [,1]
2012-03-07    1
2012-03-08    2
2012-03-09    3
2012-03-10    4
2012-03-11    5
2012-03-12    6
> tail(data)
           [,1]
2012-07-18  134
2012-07-19  135
2012-07-20  136
2012-07-21  137
2012-07-22  138
2012-07-23  139
> head(index(data))
[1] "2012-03-07" "2012-03-08" "2012-03-09" "2012-03-10" "2012-03-11" "2012-03-12"
> tail(index(data))
[1] "2012-07-18" "2012-07-19" "2012-07-20" "2012-07-21" "2012-07-22" "2012-07-23"
> range(index(data))
[1] "2012-03-07" "2012-07-23"

但是,rollapply 很奇怪。 range(index()) 给出“1 40”而不是字符串。

> rollapply(data,width=40,by=30,FUN=function(x){print(range(index(x)));length(x)})
[1]  1 40
[1]  1 40
[1]  1 40
[1]  1 40

2012-03-26 40
2012-04-25 40
2012-05-25 40
2012-06-24 40

这在官方上是奇怪的,因为在我的真实数据上,rollapply将日期范围输出为字符串。比较我的真实数据和上面的人工数据的str,它们是相同的。特别是,它们都说“按类对象索引:[Date] TZ:”,并且都说:“tclass:chr“Date”

嗯,不,我夸张了;以下人工数据与我的真实数据具有相同的结构:

data=xts(data.frame(a=1:139,b=seq(3.14,by=0.01,length.out=139)),Sys.Date()-139:1)

它有完全相同的奇怪的 rollapply 问题。

附注我提到的有用的函数是 rollapply 包装器;我没有在上面显示它,因为我不需要:核心 xts rollapply 也显示了这个问题。但当我最终在博客中讨论它时,我会在评论中发布它的链接:-)


更新

下面是一些带有 xts 对象的输出:

> rollapply(data,width=40,by=30,FUN=function(x){print(class(x));print(range(index(x)));length(x)})
[1] "xts" "zoo"
[1] "2012-01-02" "2012-02-24"
...
> class(data)
[1] "xts" "zoo"
> str(data)
An ‘xts’ object from 2012-01-02 to 2012-07-18 containing:
  Data: num [1:139, 1] 76.9 76.7 76.7 77.1 76.9 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr "Close"
  Indexed by objects of class: [Date] TZ: 
  xts Attributes:  
List of 2
 $ tclass: chr "Date"
 $ tzone : chr ""

这是我的人工 xts 对象的一些输出(除了我添加了:colnames(data)=c("Close"))

> rollapply(data,width=40,by=30,FUN=function(x){print(class(x));print(range(index(x)));length(x)})
[1] "integer"
[1]  1 40
...
> class(data)
[1] "xts" "zoo"
> str(data)
An ‘xts’ object from 2012-03-07 to 2012-07-23 containing:
  Data: int [1:139, 1] 1 2 3 4 5 6 7 8 9 10 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr "Close"
  Indexed by objects of class: [Date] TZ: 
  xts Attributes:  
List of 2
 $ tclass: chr "Date"
 $ tzone : chr ""

即相同的 str/class,相同的函数调用,但结果不同。使用以下代码从 csv 文件读取其工作的 xts 对象:

d=read.table(fname,sep=',',header=T,stringsAsFactors=F)
x=as.xts(subset(d,select=-datestamp),order.by=as.Date(d$datestamp))

最佳答案

请遵守以下规定:

rollapply(data,width=40,by=30,FUN=function(x){class(x)}) 

2012-03-26 integer
2012-04-25 integer
2012-05-25 integer
2012-06-24 integer

rollapply将数据子集传递为 integer而不是xts对象。

zoo:::rollapply.zoo的代码似乎只使用标准 [子集化,因此不清楚为什么类信息丢失。

编辑

实际上有一行:

dat <- mapply(f, seq_along(time(data)), width, MoreArgs = list(data = coredata(data), 
    ...), SIMPLIFY = FALSE)

所以只有coredata被传递给最终函数。这意味着您不能使用 rollapply获取这些部分范围。

关于r - 为什么 rollapply 内部的 range(index(x)) 的行为与外部不同(仅针对我的人工数据!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11626358/

相关文章:

r - 同一个ggplot中的多个线图

r - 将每日股票数据转换为时间序列对象时的问题

r - POSIXct 和 xts 中的时区,从 R 中的 GMT 转换

r - 在 R 如何将此 CSV 数据转换为 XTS

r - 使用 ggplot 库中的 geom_path

regex - 在正则表达式匹配后的单词后面插入\n

r - R中的聚合函数使用列索引号而不是名称

list - R 划分 2 个列表对象,每个列表对象都包含相同大小的 xts 对象

使用R中的xts和zoo包对时间序列进行重采样

performance - r:嵌套索引的 for 循环操作运行速度超慢