首页 > 解决方案 > 编写一个 Rcpp 函数来检测 NumericMatrix 是否有任何 NA 值

问题描述

我想用 NumericMatrix 参数编写一个 Rcpp 函数。如果任何矩阵元素为 NA,则返回 true,否则返回 false。我尝试在所有列上循环 is_na,但我正在寻找一种更简洁的方法。我也担心速度。

bool check(NumericMatrix M){
n=M.ncol();
  for(int i=0; i < n; i ++){
  if(is_na( M(_,i) ){ return T;}
  } 
  return F;
}

标签: rmatrixrcpp

解决方案


Rcpp 糖可以通过组合is_na()和来复制操作any()is_na()将检测缺失值并any()验证单个值是否为TRUE. 请注意,要检索布尔值,any()必须与is_true().

#include<Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
bool contains_na(NumericMatrix M){
  return is_true(any(is_na(M)));
}

测试用例:

A = matrix(1:4, nrow = 2)
contains_na(A)
# [1] FALSE

M = matrix(c(1, 2, NA, 4), nrow = 2)
contains_na(M)
# [1] TRUE

推荐阅读