문제

내가 원한이 있는지 확인하기 위해 어떤 기존의 트릭 na.locf (서 zoo 패키지), rleinverse.rleRCpp?

내가 쓴 루프 구현,예를 들어,나의 구현 na.locf(x, na.rm=FALSE, fromLast=FALSE) 다음과 같다:

#include <Rcpp.h>
using namespace Rcpp;

//[[Rcpp::export]]
NumericVector naLocf(NumericVector x) {
  int n=x.size();
  for (int i=1;i<n;i++) {
    if (R_IsNA(x[i]) & !R_IsNA(x[i-1])) {
      x[i]=x[i-1];
    }
  }
  return x;
}

제가 궁금하는 이는 매우 기본적인 기능,누군가가 있을 수 있습니다 이 구현에서 그들을 RCpp 에서는 더 좋은 방법이 될 수 있음(피 루프)또는 더 빠른 방법이 있을까?

도움이 되었습니까?

해결책

유일한 것은 내가 말하고 싶은 당신 테스트 NA 두 번에 대한 각각의 가치할 때에만 그것을 할 필요가있다.에 대한 테스트 NA 은 작동 가능하도록 설계되었습니다.아마도 이 같은 것:

//[[Rcpp::export]]
NumericVector naLocf(NumericVector x) {
    int n = x.size() ;
    double v = x[0]
    for( int i=1; i<n; i++){
        if( NumericVector::is_na(x[i]) ) {
            x[i] = v ;
        } else {
            v = x[i] ;    
        }
    }

    return x;
}

이것은 여전히 그러나는 불필요한 것처럼 설정 v 때마다 우리는 마지막으로 우리는 볼 수 없 NA.우리는 뭔가를 시도 할 수 있습니다 다음과 같다:

//[[Rcpp::export]]
NumericVector naLocf3(NumericVector x) {
    double *p=x.begin(), *end = x.end() ;
    double v = *p ; p++ ;

    while( p < end ){
        while( p<end && !NumericVector::is_na(*p) ) p++ ;
        v = *(p-1) ;
        while( p<end && NumericVector::is_na(*p) ) {
            *p = v ;
            p++ ;
        }
    }

    return x;
}

지금,우리는 일부를보십시오 벤치마크:

x <- rnorm(1e6)
x[sample(1:1e6, 1000)] <- NA 
require(microbenchmark)
microbenchmark( naLocf1(x), naLocf2(x), naLocf3(x) )
#  Unit: milliseconds
#       expr      min       lq   median       uq      max neval
# naLocf1(x) 6.296135 6.323142 6.339132 6.354798 6.749864   100
# naLocf2(x) 4.097829 4.123418 4.139589 4.151527 4.266292   100
# naLocf3(x) 3.467858 3.486582 3.507802 3.521673 3.569041   100
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top