Rcpp中的na.locf和inverse.rle

悠天

我想检查是否有任何预先存在的帽子戏法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以更好的方式(可以避免循环)或更快的方式实现了它们

罗曼·弗朗索瓦(Romain Francois)

我唯一要说的是,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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Rcpp中的na.locf和inverse.rle

来自分类Dev

C中的RLE文本压缩

来自分类Dev

C中的RLE文本压缩

来自分类Dev

cumsum is.na与Rle忽略奉献NA

来自分类Dev

在Rcpp中检查向量的Null和NA

来自分类Dev

使用RLE读取和压缩图片

来自分类Dev

使用RLE读取和压缩图片

来自分类Dev

在R中:帮助在数据框中使用rle()函数

来自分类Dev

为什么R中的rle返回错误的长度?

来自分类Dev

在R中:帮助在数据框中使用rle()函数

来自分类Dev

Python 中的这个 RLE 算法有什么问题?

来自分类Dev

RLE压缩

来自分类Dev

使用`rle`函数和`dplyr``group_by`命令来映射分组变量

来自分类Dev

避免RLE算法中的Python一对一错误

来自分类Dev

打印正确数量的相同字符时出现问题.C中的RLE

来自分类Dev

如何在具有多个条件的R中应用RLE()函数?

来自分类Dev

Rcpp中的串联和列表

来自分类Dev

等效于sparkR中的na.locf

来自分类Dev

了解RLE承保范围值

来自分类Dev

rle命令计算向量的变化

来自分类Dev

Rcpp程序中的最小和最大

来自分类Dev

R函数和Rcpp中的环境

来自分类Dev

使用条件LOCF估算NA

来自分类Dev

字体压缩!RLE或Huffman还是什么?

来自分类Dev

没有 count() 方法的 RLE 编码

来自分类Dev

glm中“准”族的含义和链接函数“ inverse”

来自分类Dev

NHibernate 小睡中的 inverse 和 readonly 属性有什么作用?

来自分类Dev

使用sourceCpp()的Rcpp和RcppArmadillo在R中的错误

来自分类Dev

RCPP中Is.factor和is.numeric的等效项