2013-10-15 1 views
1

xts 형식으로 저장된 시계열 데이터가 포함 된 목록이 있습니다. 리스트의 길이는 동일하지 않으며 날짜/행의 서브 세트 만 교차합니다.길이가 같지 않은 xts 객체가 포함 된리스트를 반복합니다.

다양한 기능을 가진 목록의 조합을 반복하고 싶습니다. 예를 들어, 차이점을 찾고 싶다고합시다.

각 단일 조합에 대해이 작업을 수행 할 수 있지만 일괄 처리를 반복하는 상위 순서 기능을 사용할 수 없습니다.

따라서, 예를 들어, 다음 각 작업은 :

combn(c(1,2), 2, function(X) exData[[X[1]]] - exData[[X[2]]]) 
combn(c(1,3), 2, function(X) exData[[X[1]]] - exData[[X[2]]]) 
combn(c(2,3), 2, function(X) exData[[X[1]]] - exData[[X[2]]]) 

은 그러나, 고차원 기능에 나의 시도가 실패 :

combn(1:length(exData), 2, function(X) exData[[X[1]]] - exData[[X[2]]]) 

대신 오류를 반환 Error in combn(1:length(exData), 2, function(X) exData[[X[1]]] - exData[[X[2]]]) : number of items to replace is not a multiple of replacement length . 나는 이것이 무엇을 의미하는지 확실하지 않다

...

예 데이터 세트

과 같이 구성 될 수있다은 다음과 같습니다

set.seed(1) 
dtime <- seq(Sys.Date(), length.out = 20, by='day') 
exData <- replicate(4, runif(sample(9:12, 1)), simplify=FALSE) 
exData <- lapply(exData, 
       function(x) xts(x, 
           order.by = sort(sample(dtime, 
                 length(x)))[1:length(x)])) 

두드러진 점은 모든 날짜가 포함 된 각 xts 객체에 있다는 것입니다 그 목록의 길이가 같지 않은지 확인하십시오. 이 시점에서 나는 함수의 적용을 제어하기 위해 xts 객체 규칙을 사용하고 있습니다. 나중에 변경 될 수 있습니다.

그래서 각각의 조합을 반복하는 적절한 방법은 무엇입니까? 조합은 아래의 열 각각에 의해 주어진다 :

combos <- combn(1:4, 2) 
R> combos 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 1 1 2 2 3 
[2,] 2 3 4 3 4 4 

참고 : 실생활 경우 각 xts 여러 열을 가지며, 2 개에 적용되는 함수의 종류를 허용 입력이 필요합니다. @ flodel의 도움으로, 나는 작업 후에 열 이름을 보존하고 원하는 융통성을 갖는 다음과 같은 기능을 만들었습니다.

funDiffName <- function(XTS, loc, ff){ 
# takes a list of XTS objects, a location pair (from combn), and the function to apply 
# preserves names following the application of ff 
    ffxy <- ff(XTS[[loc[1]]], XTS[[loc[2]]]) 
    names(ffxy) <- paste0(names(XTS[[1]]), "x", names(XTS[[2]])) 
    ffxy 
} 

SecPx_diff <- combn(1:(length(SecPx_l)), 2, 
        function(X) funDiffName(SecPx_l, X, `-`), 
        simplify = FALSE) 
+0

동일한 타임 스탬프가있는 행의 차이점을 찾으십니까? –

+0

@geektrader 예 동일한 타임 스탬프가있는 행의 차이를 찾고 있습니다. – ricardo

답변

2

오류는 R 배열로 결과를 넣어 위해 노력하고 있다는 사실에서 유래하지만 조각이 솔루션은 combn 전화에 simplify = FALSE를 추가하여 목록을 요청하는 것입니다 ... 다른 크기가있다.

+0

감사합니다. 'simplify = FALSE'가 기본 설정 이었으면 좋겠습니다. – ricardo

2

먼저 cbind이 필요합니다. xts의 경우 cbind 함수는 두 xts를 해당 인덱스로 바인딩합니다.

combn(1:length(exData), 2, function(X) { 
     temp <- cbind(exData[[X[1]]], exData[[X[2]]]) 
     temp <- (temp[, 1] - temp[, 2]) 
     temp[!is.na(temp)] 
    }, simplify = FALSE)