Rcpp には、コード内で優れたベクトル化された操作を許可するさまざまな「Rcpp sugar」コマンドがあります。以下のコードでは、データ フレームを横切って移動し、それをベクトルに分割してから、"ifelse" および "sum" シュガー コマンドを使用して、x が y または y+1 に等しい行の v の平均を計算します。すべてが正しく機能しているようです。
これよりもきちんとした方法があるかどうか疑問に思っています-たとえば、特定の条件を満たすインデックスポイントを与える「which」コマンドに相当するものはありますか? Armadillo には "find" という機能があるようですが、それは互換性のないオブジェクト タイプを使用することを意味します ("find" と "ifelse" を一緒に使用することはできません)。
同じトピックで、「ifelse」で複合論理条件を受け入れることは可能ですか? たとえば、以下の例では、indic の定義が 2 つの「ifelse」コマンドで構成されており、明らかに 1 つにしたほうがすっきりします。どんな考えでも大歓迎です。
回答をお待ちしております:)
require(Rcpp)
require(inline)
set.seed(42)
df = data.frame(x = rpois(1000,3), y = rpois(1000,3), v = rnorm(1000),
stringsAsFactors=FALSE)
myfunc1 = cxxfunction(
signature(DF = "data.frame"),
plugin = "Rcpp",
body = '
using namespace Rcpp;
DataFrame df(DF);
IntegerVector x = df["x"];
IntegerVector y = df["y"];
NumericVector v = df["v"];
LogicalVector indic = ifelse(x==y,true,ifelse(x==y+1,true,false));
double subsum = sum(ifelse(indic,v,0));
int subsize = sum(indic);
double mn = ((subsize>0) ? subsum/subsize : 0.0);
return(Rcpp::List::create(_["subsize"] = subsize,
_["submean"] = mn
));
'
)
myfunc1(df)
### OUTPUT:
#
# $subsize
# [1] 300
#
# $submean
# [1] 0.1091555
#