2012-03-01 1 views
9

xts 행렬의 모든 기간에 함수를 실행하고 싶습니다. 매우 빠르게) (적용하지만 반환 된 행렬은 원래 개체에 비해 크기를 전치했습니다apply()는 왜 transposed xts 행렬을 반환합니까?

> dim(myxts) 
[1] 7429 48 
> myxts.2 = apply(myxts, 1 , function(x) { return(x) }) 
> dim(myxts.2) 
[1] 48 7429 
> str(myxts) 
An 'xts' object from 2012-01-03 09:30:00 to 2012-01-30 16:00:00 containing: 
    Data: num [1:7429, 1:48] 4092500 4098500 4091500 4090300 4095200 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:48] "Open" "High" "Low" "Close" ... 
    Indexed by objects of class: [POSIXlt,POSIXt] TZ: 
    xts Attributes: 
NULL 
> str(myxts.2) 
num [1:48, 1:7429] 4092500 4098500 4091100 4098500 0 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:48] "Open" "High" "Low" "Close" ... 
    ..$ : chr [1:7429] "2012-01-03 09:30:00" "2012-01-03 09:31:00" "2012-01-03 09:32:00" "2012-01-03 09:33:00" ... 
> nrow(myxts) 
[1] 7429 
> head(myxts) 
         Open High  Low Close 
2012-01-03 09:30:00 4092500 4098500 4091100 4098500 
2012-01-03 09:31:00 4098500 4099500 4092000 4092000 
2012-01-03 09:32:00 4091500 4095000 4090000 4090200 
2012-01-03 09:33:00 4090300 4096400 4090300 4094900 
2012-01-03 09:34:00 4095200 4100000 4095200 4099900 
2012-01-03 09:35:00 4100000 4100000 4096500 4097500 

가 어떻게 myxts 치수를 보존 할 수 있습니까?

+1

작은 데이터 조각이 도움이되므로 문제를 재현 할 수 있습니다. – Justin

답변

15

이것이 바로 apply의 문서입니다. ?apply에서 :

값 : 귀하의 경우

If each call to ‘FUN’ returns a vector of length ‘n’, then ‘apply’ 
returns an array of dimension ‘c(n, dim(X)[MARGIN])’ if ‘n > 1’. 

(당신이 행 전체를 반복하고 있기 때문에), 'n'=48, 그래서 apply는 차원 c(48, 7429)의 배열을 반환합니다.

또한 myxts.2이 아니며xts 개체입니다. 그것은 규칙적인 배열입니다. 당신은 몇 가지 옵션이 있습니다 :

  1. 이 XTS를 다시 작성하기 전에 apply의 결과를 전치하는 객체 :

    data(sample_matrix) 
    myxts <- as.xts(sample_matrix) 
    dim(myxts) # [1] 180 4 
    myxts.2 <- apply(myxts, 1 , identity) 
    dim(myxts.2) # [1] 4 180 
    myxts.2 <- xts(t(apply(myxts, 1 , identity)), index(myxts)) 
    dim(myxts.2) # [1] 180 4 
    
  2. 벡터 라이가가의 모든 행에서 작동 귀하의 기능이 객체를 XTS와 xts 객체를 반환합니다. 그렇다면 걱정할 필요가 없습니다 약 apply.

마지막으로 재현 가능한 예를 제공하십시오. 그다지 어렵지 않아 사람들이 쉽게 도울 수 있습니다. 위의 예제를 제공 했으므로 다음 질문에서이 예제를 사용할 수 있기를 바랍니다.

+0

옵션 2를 원한다면 각 행을 처리 기능에 어떻게 전달할 수 있습니까? 예를 들어, myxts $ result = myxts $ Close - myxts $는 특정 필드에 대해 작동하지만, 전체 행을 전달하는 함수를 매개 변수 중 하나로 호출하려면 어떻게해야합니까? –

+1

@RobertKubrick : 귀하의 기능을 보지 않고는 대답 할 수 없습니다. 가능할 수도 그렇지 않을 수도 있습니다. 최소한 옵션 1을 사용하는 다른 함수로 처리 함수를 래핑 할 수 있습니다. 실제로 벡터화되지는 않지만 많은 작업을 수행하면보다 명확 해집니다. –

+0

솔루션 1은 for 루프에 비해 매우 빠릅니다. 이유를 이해하고 싶지만 다른 질문 일 수 있습니다. –