2013-07-16 1 views
1

나는 xts의 일부로 고유 한 수치 인자를 갖고 싶다. 따라서 시간이 지남에 따라 ... 각 숫자는 시간과 관계없이 특정 인자를 참조한다.인자의 수

예를 들어, 매일 구성 요소를 변경하는 주가 지수를 상상해보십시오. 나는이 편지 주식 시세 표시기

universe <- apply(as.data.frame(expand.grid(letters,letters)),1,paste0,collapse="") 

과 우주에서 주식 시세 표시기의 (20)의 임의의 표본 인 인덱스가 만들어 질 때마다 일의 다음과 같은 우주가 있다면 우리는이를 시뮬레이션 할 수 있습니다.

subsample.list <- lapply(1:50, function(y){ 
    sort(sample(universe,20,replace=FALSE)) 
}) 

50 일 고유 한 주식의 키는 다음과 같습니다

uni.subsample <- sort(unique(unlist(subsample.list))) 

나는 기본적으로 내가 XTS 개체를 고유 한 경우 인덱스에 매일 된 주식을 볼 수 있도록하고 싶습니다 요인.

tmp <- xts(do.call(rbind,subsample.list),Sys.Date()-c(50:1)) 

가 XTS을 만들려면이이 방법을 사용하는 것을 의미하지 않지만

.... 내가 좋아하는 뭔가를 생각했다.

I는 tmp.adjusted['20130716'][1,]uni.subsample의 수치를 나타내는 길이 (20)의 수의 수치 벡터 될 경우, 각 숫자가 너무 uni.subsample

에서 티커는 숫자 행렬로 coredata 은밀한하고자하지만 2013 년 7 월 16 일, 다음과 같은 방법으로 객체를 사용하여 2013-07-16 색인 회원을 모두 얻을 수있을 것으로 기대합니다. uni.subsample[tmp.adjusted['20130716'][1,]] ... ie tmp.adjusted하는 TMP의 조정이 난이 말이 희망 uni.subsample

과 관련된 고유 한 수준 ...와, 요인으로 문자열을 변환은 좀 열심히 설명하는 ....

+0

죄송합니다,하지만 난 그것을하지 않았다. : \ – asb

+0

어떤 비트를 얻지 못했습니까? 그래서 시도하고 명확하게하는 데 도움이 될 수 있습니다. –

답변

3

:

tmp.int <- xts(matrix(as.integer(factor(tmp,levels=uni.subsample,ordered=TRUE)), 
      ncol=ncol(tmp)),index(tmp)) 

당신은 기본적으로 자신의 수준 순서로 정렬 된 요소의 매트릭스를 코딩 위해 노력하고 있습니다. 일부 벤치마킹을 추가

편집 :

set.seed(1233) 
N <- 5000 
subsample.list <- lapply(seq(N), function(y){ 
    sort(sample(universe,20,replace=FALSE)) 
}) 
uni.subsample <- sort(unique(unlist(subsample.list))) 
tmp <- xts(do.call(rbind,subsample.list),Sys.Date()-seq(N)) 
ag <- function() xts(matrix(as.integer(factor(tmp,levels=uni.subsample,ordered=TRUE)), 
         ncol=ncol(tmp)),index(tmp)) 
no <- function()xts(apply(X=tmp, 
          MARGIN=c(1,2), function(x) which(uni.subsample == x)), 
       index(tmp)) 
library(microbenchmark) 
microbenchmark(ag(),no(),times=1) 

## N = 50 ag 24 faster 
microbenchmark(ag(),no(),times=1) 
Unit: milliseconds 
expr  min  lq median  uq  max neval 
ag() 1.126405 1.126405 1.126405 1.126405 1.126405  1 
## N = 500 ag 135 fatser 
microbenchmark(ag(),no(),times=10) 
Unit: milliseconds 
expr  min   lq  median   uq  max neval 
ag() 23.38484 26.19744 31.13428 35.51057 44.96251 10 
no() 3115.24902 3220.04940 3250.63773 3288.66867 3470.35053 10 
    no() 24.000003 24.000003 24.000003 24.000003 24.000003  1 
+0

나는 이것을 더 좋아한다. 탁월한 속도 향상. – Noah

+1

동의! 미안 해요 @ 아니야,하지만 agstudy에 대한 정답을 옮길거야. –

1

을하는 방법에 대해 :

다음은 벡터화 솔루션
tmp.int <- xts(apply(X=tmp, MARGIN=c(1,2), function(x) which(uni.subsample == x)), 
    index(tmp)) 

# to perform the lookup (e.g., 'find the name of the first value on May 27, 2013'): 
uni.subsample[tmp.int['2013-05-27'][,1]] 
+0

저에게 잘 어울립니다! 감사! –