R中累积排名第n的项目

时间:2015-04-04 15:31:51

标签: r ranking

我有一个项目列表,例如:

x=c(1.1, 1.3, 1.2, 1.4, 1.0)

并希望产生滚动,例如使用cumrank(x,2)形式的函数来表示第3项(计数从0开始),向下滚动列表以提供类似:

cumrank(x,2)
-> NA, NA, 1.3, 1.3, 1.2

当我们在列表中工作时,这需要对项目进行排序,然后找到第三项。

内置的cummin()cummax()函数可能会按照递增或递减的顺序对列表进行排序,然后选择第一个项目,但我想知道:是否允许这些函数的推广我按要求抓住第n个项目?

1 个答案:

答案 0 :(得分:3)

您可以编写自己的功能

cumrank <- function(x, k){
  n <- length(x)
  y <- rep(NA, n)
  for (i in (k+1):n){
    y[i] = sort(x[1:i])[k + 1]        
  }
  y
}
 cumrank(x, 2)
[1]  NA  NA 1.3 1.3 1.2

对于冗长的向量,Rcpp解决了速度问题。

library(Rcpp)
cppFunction('std::vector<double> cumrank_Cpp(std::vector<double> x, int k) {
    int n = x.size();
    std::vector<double> v(x.begin(), x.begin() + k+1);
    std::make_heap(v.begin(), v.end());
    std::vector<double> nth(n);
    for(int i=k; i < n; i++){
      nth[i]=v.front();
      v.push_back(x[i+1]); std::push_heap(v.begin(), v.end()); 
      std::pop_heap(v.begin(), v.end()); v.pop_back();
    }
    return nth;
}')