2014-02-24 2 views
2

는 R 함수위한 여분 (다중 열 XTS 함께 사용될 때 매우 느린)

XTS ::: na.locf.xts

매우 느리다 몇 개 컬럼 이상의 여러 컬럼 xts. 실제로이 루프는 na.locf.xts 코드에 있습니다.
이 루프를 피하는 방법을 찾으려고합니다.

아이디어가 있으십니까?

+0

왜 루프가 없습니까? 당신은 for-loops가 느린 (실수로) 많은 사람들 중 하나입니까? –

답변

2

na.locf.xts의 루프는 개체의 각 열에 대해 전체 개체의 복사본을 만들기 때문에 속도가 느립니다. 루프 자체는 느리지 않습니다. [.xts에 의해 생성 된 복사본은 느립니다.

R-Forge에 실험용 (따라서 알아볼 수없는) 버전 na.locf.xts이 있습니다.이 버전을 사용하면 열을 C로 이동하여 개체를 복사하지 않아도됩니다. 아주 큰 객체의 경우에는 조금 더 빠릅니다.

set.seed(21) 
m <- replicate(20, rnorm(1e6)) 
is.na(m) <- sample(length(x), 1e5) 
x <- xts(m, Sys.time()-1e6:1) 
y <- x[1:1e5,1:3] 

> # smaller objects 
> system.time(a <- na.locf(y)) 
    user system elapsed 
    0.008 0.000 0.008 
> system.time(b <- xts:::.na.locf.xts(y)) 
    user system elapsed 
    0.000 0.000 0.003 
> identical(a,b) 
[1] TRUE 

> # larger objects 
> system.time(a <- na.locf(x)) 
    user system elapsed 
    1.620 1.420 3.064 
> system.time(b <- xts:::.na.locf.xts(x)) 
    user system elapsed 
    0.124 0.092 0.220 
> identical(a,b) 
[1] TRUE 
+0

참고로 실험용 버전의 na.locf.xts 링크입니다. https://r-forge.r-project.org/scm/viewvc.php/pkg/xts/R/na.R?view= 마크 업 및 수정 = 793 & root = xts – RockScience

1
timeIndex <- index(x) 
x <- apply(x, 2, na.locf) 
x <- as.xts(x, order.by = timeIndex) 

이 는 컬럼 별 데이터 복사를 방지한다. 이없이 n 번째 열을 채울 때 1 : (n-1) 열의 복사본을 만들고 n 번째 열을 추가하면 n이 클 때 매우 느리게됩니다.