相关疑难解决方法(0)

在Rcpp中排序排列,即base :: order()

我有很多代码使用base :: order()命令,我真的懒得在rcpp中编写代码.由于Rcpp只支持排序,但不支持订单,我花了2分钟创建这个功能:

// [[Rcpp::export]]
Rcpp::NumericVector order_cpp(Rcpp::NumericVector invec){
  int leng = invec.size();
  NumericVector y = clone(invec);
  for(int i=0; i<leng; ++i){
    y[sum(invec<invec[i])] = i+1;
  }
  return(y);
}
Run Code Online (Sandbox Code Playgroud)

它有点工作.如果向量包含唯一数字,我得到与order()相同的结果.如果它们不是唯一的,结果是不同的,但没有错(实际上没有唯一的解决方案).

使用它:

c=sample(1:1000,500)
all.equal(order(c),order_cpp(c))
microbenchmark(order(c),order_cpp(c))

Unit: microseconds
         expr      min       lq   median       uq      max neval
     order(c)   33.507   36.223   38.035   41.356   78.785   100
 order_cpp(c) 2372.889 2427.071 2466.312 2501.932 2746.586   100
Run Code Online (Sandbox Code Playgroud)

哎哟! 我需要一个有效的算法.好的,所以我挖出了一个bubbleort实现并对其进行了调整:

 // [[Rcpp::export]]
Rcpp::NumericVector bubble_order_cpp2(Rcpp::NumericVector vec){                                  
       double tmp = 0;
       int n = vec.size();
              Rcpp::NumericVector outvec = clone(vec);
       for (int i …
Run Code Online (Sandbox Code Playgroud)

r rcpp

7
推荐指数
2
解决办法
2380
查看次数

Rcpp排名函数,平均联系

我有一个自定义的等级函数,我从这里偷了(有一些修改):) 等级函数的Rcpp sugar

问题是,它确实关系密切,我需要平均关系

这是我所拥有的

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector sort_rcpp(NumericVector x) {
  std::vector<double> tmp = Rcpp::as< std::vector<double> > (x);
  std::sort(tmp.begin(), tmp.end());
  return wrap(tmp);
}

// [[Rcpp::export]]
IntegerVector rank_(NumericVector x) {
  return match(x, sort_rcpp(x));
}


/*** R
x <- c(1:5, 1:5)

rank(x, ties = 'average')
rank(x, ties = 'min')
rank_(x)
*/
Run Code Online (Sandbox Code Playgroud)

将其保存到文件后,运行此命令可获得结果

Rcpp::sourceCpp('~/Documents/Rank.cpp')
Run Code Online (Sandbox Code Playgroud)

哪个返回

# x <- c(1:5, 1:5)
#
# # what I need
# rank(x, ties = 'average')
# [1] 1.5 3.5 5.5 7.5 9.5 …
Run Code Online (Sandbox Code Playgroud)

r rcpp

3
推荐指数
1
解决办法
410
查看次数

标签 统计

r ×2

rcpp ×2