我有一个项目清单,例如:
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()
函数可能会按升序或降序对列表进行排序,然后选择第一项,但我想知道:是否对这些函数有一个概括,可以让我根据需要抓取第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;
}')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句