【问题标题】:Write an Rcpp function to detect if a NumericMatrix has any NA values编写一个 Rcpp 函数来检测 NumericMatrix 是否有任何 NA 值
【发布时间】:2020-04-14 10:29:09
【问题描述】:

我想编写一个带有 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;
}

【问题讨论】:

  • 矢量化 R 运算速度很快。尝试 R 中的 any(is.na(M)) 并对其进行分析。
  • 你是对的。现在,此检查功能旨在用于更大的 Rcpp 功能。将 any(is.na(M)) 传输到 Rcpp 的好方法是什么?通过列循环 is_na 是要走的路吗?
  • 你找到 Rcpp 糖功能并在那里检查了吗?你可能会喜欢你发现的东西(我们有一个小优势,像 any(...) 这样的运算符可以在第一个 TRUE 退出。R 将始终运行完整的向量......

标签: r matrix rcpp


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2016-01-06
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多