首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rcpp中缺失值的快速检测

Rcpp中缺失值的快速检测
EN

Stack Overflow用户
提问于 2017-10-23 14:53:17
回答 2查看 1.1K关注 0票数 5

这个问题与NA values in Rcpp conditional有关。

我基本上有一些Rcpp代码,可以在多个(双)元素上循环。我需要检查是否有缺少的值,对于每个元素(而且我不能使用向量化)。让我们计算一下向量中丢失的值的数量,就像最小可再现的例子一样:

代码语言:javascript
复制
#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int nb_na(const NumericVector& x) {
  int n = x.size();
  int c = 0;
  for (int i = 0; i < n; i++) if (R_IsNA(x[i])) c++;
  return c;
}

// [[Rcpp::export]]
int nb_na3(const NumericVector& x) {
  int n = x.size();
  int c = 0;
  for (int i = 0; i < n; i++) if (x[i] == 3) c++;
  return c;
}

// [[Rcpp::export]]
LogicalVector na_real(NumericVector x) {
  return x == NA_REAL;
}

然后,在R中,我们得到:

代码语言:javascript
复制
> x <- rep(c(1, 2, NA), 1e4)

> x2 <- replace(x, is.na(x), 3)

> microbenchmark::microbenchmark(
+   nb_na(x),
+   nb_na3(x2)
+ )
Unit: microseconds
       expr     min      lq      mean  median       uq      max neval
   nb_na(x) 135.633 135.982 153.08586 139.753 140.3115 1294.928   100
 nb_na3(x2)  22.490  22.908  30.14005  23.188  23.5025  684.026   100

> all.equal(nb_na(x), nb_na3(x2))
[1] TRUE

> na_real(x[1:3])
[1] NA NA NA

正如在链接问题中所指出的,您不能只检查x[i] == NA_REAL,因为它总是返回一个缺失的值。然而,使用R_IsNA(x[i])比用数字值(例如3)检查等式要慢得多。

基本上,我想要一个解决方案,在这里我可以检查单个值是否是一个缺失的值。此解决方案应该与使用数字值检查等式一样快。

EN

Stack Overflow用户

发布于 2017-10-23 15:08:19

检查(IEEE)缺少的浮点值是一种昂贵的操作,没有办法避免它。这与R.

这就是为什么我们对即将到来的R中的ALTREP感到兴奋的一个原因--例如,我们可以跟踪一个双/实向量是否包含缺失的值--如果没有,我们就不用浪费时间去寻找它们。虽然没有更新以提及ALTREP,但您可以从https://github.com/HenrikBengtsson/Wishlist-for-R/issues/12获得gist

票数 4
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46892399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档