2012-07-24 2 views
2

유용한 R 함수에 대해 블로그를 만들었습니다. 더미 데이터를 만들었지 만 더미 데이터는 다르게 동작합니다! 도움!rollapply 내부의 범위 (인덱스 (x))가 외부와 다르게 동작하는 이유는 무엇입니까?

> 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 이상해 :

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

은 보면 모두 좋아 보인다. range(index())은 문자열 대신 "1 40"을 제공합니다. 내 실제 데이터를 rollapply 문자열로 날짜 범위를 출력하기 때문에

> 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 

이 공식적으로 이상한입니다. 내 실제 데이터와 위의 인공 데이터에 대해 str을 비교하면 동일합니다. 그들은 모두 말을 특히 둘 다 ': [날짜] TZ이 클래스의 객체에 의해 색인'말 '인 TClass : CHR "날짜"'

글쎄, 아니, 내가 과장; 다음 인공 데이터는 실제 데이터와 동일한 구조를 가지고 있습니다.

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

정확하게 동일한 이상한 롤 적용 문제가 있습니다.

P. 내가 언급 한 유용한 함수는 rollapply wrapper이다. 위의 내용을 보여주지 않았기 때문에 xts rollapply 코어도 문제를 보여줍니다. 나는 마침내


UPDATE 여기

:-) 그것에 대해 블로그하지만 내가 코멘트에서, 여기에 링크를 게시 해 드리겠습니다 것은 작동하는 XTS 객체 일부 출력 :

> 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 "" 
: 여기
> 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 "" 

은 (colnames(data)=c("Close")를 내가 추가 한 제외) 내 인공 XTS 객체 일부 출력

즉, 동일한 str/클래스, 동일한 함수 호출이지만 다른 결과. XTS는이 코드를 사용하여 CSV 파일에서 읽어 작동 곳 오브젝트 :

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

답변

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 오히려 xts 객체보다 integer으로 데이터의 하위 집합을 전달합니다.

zoo:::rollapply.zoo 코드는 표준 [ 하위 집합 만 사용하므로 클래스 정보가 손실되는 이유가 명확하지 않습니다.

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

그래서에만 coredata가 최종 함수에 전달되는 :

편집

사실 선이있다. 즉, rollapply을 사용하여 이러한 부분 범위를 가져올 수 없습니다.

+0

감사합니다. 그것은 유용한 단서처럼 보입니다. 클래스에 대해 "xts" "zoo"가 표시되고 "정수"(또는 "숫자")가 표시되지 않는 곳의 코드 (질문에 추가 한 업데이트를 참조하십시오.) –

+0

BTW, 사용되는 코드는'xts ::: rollapply.xts'입니다. (또는 R 객체 모델을 다시 한번 오해했습니다 :-) –

+1

@DarrenCook :'xts ::: rollapply.xts'는 다음과 같이 export되거나 등록되지 않았습니다. S3 방법이므로 사용되지 않습니다. –