中,有各种"Rcpp sugar"命令允许在代码中进行很好的矢量化操作。在下面的代码中,我在数据帧上移动,将其分解为向量,然后使用"ifelse"和"sum"sugar命令来计算x等于y或y+1的行上的v平均值。一切似乎都正常工作。
只是想知道是否有比这更整洁的方法 - 例如,等效于提供满足特定条件的索引点的"哪个"命令?在犰狳中似乎有一个工具可以作为"find"使用,但这意味着使用不兼容的对象类型(你不能同时使用"find"和"ifelse")。
在同一个主题上,是否有可能让"ifelse"接受复合逻辑条件?例如,在下面的示例中,印度语的定义由两个"ifelse"命令组成,它显然会更清晰。任何想法将不胜感激。
期待听到您的回复:)
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
#
Rcpp (>= 0.10.0) 在两个逻辑糖表达式之间实现 | 运算符。所以你可以做到:
require( Rcpp )
cppFunction( code = '
List subsum( IntegerVector x, IntegerVector y, NumericVector v){
using namespace Rcpp ;
LogicalVector indic = (x==y) | (x==y+1) ;
int subsize = sum(indic) ;
double submean = subsize == 0 ? 0.0 : sum(ifelse(indic,v,0)) / subsize ;
return List::create( _["subsize"] = subsize, _["submean"] = submean ) ;
}
' )
subsum( rpois(1000,3), rpois(1000,3), rnorm(1000) )
# $subsize
# [1] 320
#
# $submean
# [1] -0.05708866