我需要從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
在我的使用情況下,我需要在一個循環做這個約一百萬次(RCPP函數內)和載體可能是相當長的(假設1000元)。我還調查了使用x.array()==x.array()
找到所有NA
/NaN
值的路由,但無法找到使用結果與Eigen進行子集的方法。
我想沒有辦法在過程中早些時候刪除'NA'? –
不幸的不是。在我真實的用例中,我將三個矩陣傳遞給函數,並在相應的列向量之間進行迴歸。爲此,我需要刪除NA案例。所以我需要'lm'中的'na.omit'。我不想在R中的列索引上循環。 – Roland