大きな行列(1〜1000万列×1000行)を扱うためにR bigmemoryパッケージとRcppを使用しています。いったん私が0、2、およびNAで構成されるインタジェクタ・マトリックスを、RIのファイル・バックされたビッグ・メモリ・マトリックスに読み込むと、C++を使ってすべてのNA値を変更して、カラムあたりの平均値または任意の値の帰属を転用したい後者をここに示す)。bigmemory rcppでファイルバッキングされた行列の値を変更する方法
以下は私が書いたRcpp関数であり、動作しません。私の望みは、R内からBigNA([email protected])
を呼び出すと、NAsである行列内の要素を見つけ出し、バッキングファイルでその値を直接変更できることでした。
std::isnan(mat[j][i])
の評価で問題が発生している可能性があります。私はアキュムレータでNA値を数え、実際にはNAを数えなかった代替関数を作成することでこれを確認しました。しかし、これが解決されると、式mat[j][i] = 1
がバッキングファイルの値を変更するかどうかもわかりません。それらのステートメントを書くことは、Rの背景を持っている私にとっては直感的だが、間違っているかもしれない。
ご迷惑をおかけして申し訳ございません。
#include <stdio.h>
#include <Rcpp.h>
#include <bigmemory/MatrixAccessor.hpp>
#include <numeric>
// [[Rcpp::depends(BH, bigmemory)]]
// [[Rcpp::depends(Rcpp)]]
// [[Rcpp::export]]
void BigNA(SEXP pBigMat) {
/*
* Imputation of "NA" values for "1" in a big 0, 2 NA matrix.
*/
// Create the external bigmatrix pointer and iniciate matrix accessor
XPtr<BigMatrix> xpMat(pBigMat);
MatrixAccessor<int> mat = (*xpMat);
// Iterater over the elements in a matrix and when NA is found, substitute for "1"
for(int i=0; i< xpMat->ncol(); i++){
for(int j=0; j< xpMat->nrow(); j++){
if(std::isnan(mat[j][i])){
mat[j][i] = 1;
}
}
}
}
ありがとうございます。これは、実際には、NAが存在する位置でのint値です。私はそのように実装しようとします。 –
外部ヘッダを使わずに、MatrixAccessorを使っても動作します。こうして答えが受け入れられた。 –