큰 행렬 (1에서 10 백만 열 x 1000 행)을 처리하기 위해 R bigmemory 패키지와 Rcpp를 사용하고 있습니다. 일단 RI에서 filebacked bigmemory 행렬에 0, 2 및 NA로 구성된 interger 행렬을 읽으려면 C++을 통해 모든 NA 값을 수정하여 컬럼 당 평균 값 또는 임의 값 대체 (imputation)를 수행하고 싶습니다. 여기에 후자 표시).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'을 사용해도 작동합니다. 따라서 대답을 받아 들였다. –