2012-01-17 5 views
0

여러 주식 기호에 대한 시계열을 포함하는 xts 개체가 있습니다. I 행의 전체 세트를 포함하는 원래 xts 행렬의 모든 하위 그룹 심볼 특정 서브 그룹에 xts 객체를 분할하여 처리 된 데이터를 각각의 심볼에 대해 다음 재 조립해야한다. 각 기호는 1 ~ 4 자 사이의 필드로 하위 그룹의 행렬을 분할하는 요소 인덱스로 사용됩니다. this 우수 블로그 게시물에서 사용할 수있는 데이터 프레임과 매트릭스 하위 그룹 작업에R과 R의 성능 차이가 큰 이유는 무엇입니까?

> dim(ets) 
[1] 442750  24 
> head(ets) 
        Symbol DaySec ExchTm    LclTm    Open  High  Low  Close  CloseRet  
2011-07-22 09:35:00 "AA" "34500" "09:34:54.697.094" "09:34:54.697.052" " 158100" " 158400" " 157900" " 158200" " 6.325111e-04" 
2011-07-22 09:35:00 "AAPL" "34500" "09:34:59.681.827" "09:34:59.681.797" "3899200" "3899200" "3892200" "3894400" "-1.231022e-03" 
2011-07-22 09:35:00 "ABC" "34500" "09:34:49.805.994" "09:34:49.806.008" " 400100" " 401800" " 400100" " 401600" " 3.749063e-03" 
2011-07-22 09:35:00 "ALL" "34500" "09:34:59.009.001" "09:34:59.008.810" " 285500" " 285500" " 285300" " 285300" "-7.005254e-04" 
2011-07-22 09:35:00 "AMAT" "34500" "09:34:59.982.447" "09:34:59.982.423" " 130200" " 130500" " 130200" " 130500" " 2.304147e-03" 
2011-07-22 09:35:00 "AMZN" "34500" "09:34:48.012.576" "09:34:48.012.565" "2137400" "2139100" "2137400" "2139100" " 7.953588e-04" 
... (15 more columns) 
> system.time(by(ets, ets$Symbol, function(x) { return(x) })) 
    user system elapsed 
78.725 0.932 79.735 
> system.time(ddply(as.data.frame(ets), "Symbol", function(x) { return (x) })) 
    user system elapsed 
100.590 0.416 101.105 
> system.time(lapply(split.default(ets, ets$Symbol), function(x) { return(x) })) 
    user system elapsed 
    1.572 0.280 1.853 

대한 자세한 내용은 다음과 같습니다

이들은 by(), lapply()ddply()를 호출 할 때 내 매트릭스를 분할보고 시간입니다.

왜 lapply/split.default를 사용할 때 성능에 큰 차이가 있습니까? 숫자 모드에서 작업

+0

이 myxts''의 작은 샘플을 제공하십시오. 나는'by '을 사용하지 않고 표준 xts 도구로 원하는 것을 할 수있는 방법이 있지만 재현 할 수있는 예제 없이는 알기가 어렵습니다. –

+0

예, 'head (myxts)'가 너무 큽니다. 'X : Y' 행이'Symbol'을위한 하나 이상의 값을 포함하고있는'myxts [X : Y, 1 : 5]'는 어떨까요? 그리고'summary'가 문자에 대해 유용한 것을 어떻게 알려줍니까? –

+0

나는 당신이하려고하는 것을 이해하지 못한다고 생각하지만,'lapply (split.default (myxts, myxts $ Symbol), str)'와 같은 것을 호출하려고한다. –

답변

0

크게 처리 시간을 줄일 :

> system.time(by(myxts[,c(1,2,3,4,5)], myxts$Symbol, summary)) 
    user system elapsed 
57.768 0.688 58.511 
> system.time(by(myxts[,c(1,2,3,4,5,6,7,8)], myxts$Symbol, summary)) 
    user system elapsed 
    62.284 0.620 62.971 
> system.time(by(myxts[,c(1,2,3,4,5,6,7,8, 9, 10, 11, 12)], myxts$Symbol, summary)) 
    user system elapsed 
76.529 0.632 77.232 
> myxts.numeric = myxts 
> mode(myxts.numeric) = "numeric" 
Warning message: 
In as.double.xts(c("AA", "AAPL", "ABC", "ALL", "AMAT", "AMZN", "BAC", : 
    NAs introduced by coercion 
> system.time(by(myxts.numeric[,c(1,2,3,4,5,6,7,8, 9, 10, 11, 12)], myxts$Symbol, summary)) 
    user system elapsed 
    4.948 0.688 5.642