这个问题与NA values in Rcpp conditional有关。
我基本上有一些Rcpp代码,可以在多个(双)元素上循环。我需要检查是否有缺少的值,对于每个元素(而且我不能使用向量化)。让我们计算一下向量中丢失的值的数量,就像最小可再现的例子一样:
#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中,我们得到:
> 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)检查等式要慢得多。
基本上,我想要一个解决方案,在这里我可以检查单个值是否是一个缺失的值。此解决方案应该与使用数字值检查等式一样快。。
发布于 2017-10-23 15:08:19
检查(IEEE)缺少的浮点值是一种昂贵的操作,没有办法避免它。这与R.
这就是为什么我们对即将到来的R中的ALTREP感到兴奋的一个原因--例如,我们可以跟踪一个双/实向量是否包含缺失的值--如果没有,我们就不用浪费时间去寻找它们。虽然没有更新以提及ALTREP,但您可以从https://github.com/HenrikBengtsson/Wishlist-for-R/issues/12获得gist
https://stackoverflow.com/questions/46892399
复制相似问题