RcppEigen으로 구현 된 함수 내의 벡터에서 NA
값을 효율적으로 제거해야합니다. 물론 루프를 사용하여 for
을 사용할 수는 있지만보다 효율적인 방법이 있는지 궁금합니다. 여기 NA 값을 효율적으로 제거하십시오.
library(RcppEigen)
library(inline)
incl <- '
using Eigen::Map;
using Eigen::VectorXd;
typedef Map<VectorXd> MapVecd;
'
body <- '
const MapVecd x(as<MapVecd>(xx)), y(as<MapVecd>(yy));
VectorXd x1(x), y1(y);
int k(0);
for (int i = 0; i < x.rows(); ++i) {
if (x.coeff(i)==x.coeff(i) && y.coeff(i)==y.coeff(i)) {
x1(k) = x.coeff(i);
y1(k) = y.coeff(i);
k++;
};
};
x1.conservativeResize(k);
y1.conservativeResize(k);
return Rcpp::List::create(Rcpp::Named("x") = x1,
Rcpp::Named("y") = y1);
'
na.omit.cpp <- cxxfunction(signature(xx = "Vector", yy= "Vector"),
body, "RcppEigen", incl)
na.omit.cpp(c(1.5, NaN, 7, NA), c(7.0, 1, NA, 3))
#$x
#[1] 1.5
#
#$y
#[1] 7
I합니다 (Rcpp 기능 내부) 루프에서이 약 백만 번을해야하고, 벡터가 매우 길 수도 (의 1000 개 요소를 가정하자).
추신 : 나는 x.array()==x.array()
을 사용하여 모두 NA
/NaN
값을 찾을 수있는 경로를 조사했지만 Eigen으로 하위 집합에 결과를 사용하는 방법을 찾을 수 없습니다.
: R의
na.omit
에 내장보다 더 빠르게이 실행 :
예를 들어, 여기에 하나의 벡터에서
NA
값을 생략 간단한na.omit.cpp
기능입니다 그 과정에서 이전에 'NA'를 제거 하시겠습니까? –불행히도 아닙니다. 내 실제 사용 사례에서는 함수에 세 개의 행렬을 전달하고 해당 열 벡터 간의 회귀를 수행합니다. 그리고 그 때문에 NA 사례를 제거해야합니다. 그래서 나는 작품에'na.omit'과 같은 것을 필요로합니다. R에서 열 인덱스를 반복하고 싶지 않습니다. – Roland