我正准备发表关于我所做的有用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问题。
P.S。我提到的有用功能是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))
答案 0 :(得分:2)
请注意以下事项:
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
来获取这些部分范围。