2

作成した便利な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())文字列の代わりに「140」を与えます。

> 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は日付範囲を文字列として出力するため、これは公式には奇妙です。私の実際のデータと上記の人工データを比較すると、それらは同一です。特に、彼らは両方とも「クラスのオブジェクトによって索引付けされています:[日付] TZ:」と言い、両方とも次のように言います:' tclass:chr "Date" 'str

いいえ、誇張しています。次の人工データは、私の実際のデータと同じ構造です。

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

それはまったく同じ奇妙なrollapplyの問題を抱えています。

PS私が言及した便利な関数はrollapplyラッパーです。必要がないため、上記では示していません。コアxtsrollapplyも問題を示しています。しかし、私がついにそれについてブログを書いたときに、コメントでそれへのリンクを投稿します:-)


アップデート

これが機能する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、同じ関数呼び出しですが、結果が異なります。それが機能するxtsオブジェクトは、次のコードを使用してcsvファイルから読み取られます。

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

1 に答える 1

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

rollapplyintegerオブジェクトではなく、データのサブセットを渡していxtsます。

のコードはzoo:::rollapply.zoo標準[のサブセット化のみを使用しているように見えるため、クラス情報が失われている理由は明らかではありません。

編集

実際には次の行があります。

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

coredataそのため、最終的な関数に渡されるのは だけです。rollapplyこれは、これらの部分的な範囲を取得するために使用できないことを意味します。

于 2012-07-24T09:55:19.557 に答える