R中的累积排名第n项
Cumulative-ranked n'th item in R
我有一个项目列表,例如:
x=c(1.1, 1.3, 1.2, 1.4, 1.0)
并想产生第 n 个滚动,例如使用 cumrank(x,2)
形式的函数来表示第 3 个项目(计数从 0 开始)向下滚动列表以给出如下内容:
cumrank(x,2)
-> NA, NA, 1.3, 1.3, 1.2
当我们在列表中工作时,这需要对迄今为止的项目进行排序,然后找到第三项。
内置的 cummin()
和 cummax()
函数大概会按升序或降序对列表进行排序,然后 select 第一项,但我想知道:是否有一个概括允许我根据需要获取第 n 个项目的那些功能?
您可以编写自己的函数
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;
}')
我有一个项目列表,例如:
x=c(1.1, 1.3, 1.2, 1.4, 1.0)
并想产生第 n 个滚动,例如使用 cumrank(x,2)
形式的函数来表示第 3 个项目(计数从 0 开始)向下滚动列表以给出如下内容:
cumrank(x,2)
-> NA, NA, 1.3, 1.3, 1.2
当我们在列表中工作时,这需要对迄今为止的项目进行排序,然后找到第三项。
内置的 cummin()
和 cummax()
函数大概会按升序或降序对列表进行排序,然后 select 第一项,但我想知道:是否有一个概括允许我根据需要获取第 n 个项目的那些功能?
您可以编写自己的函数
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;
}')