计算移动矩阵的百分位数

Calculating percentile of moving matrix

我正在处理财务比率,我想构建一个数据框,其中包含相对于移动矩阵的观察值的百分比顺序。

假设我有如下数据框

AAPL <- c(5,7,15,6,9,15,12,10,5,8)
MSFT <- c(20,14,12,15,10,15,18,22,17,20)
df <- data.frame (AAPL, MSFT)

我想做的是创建一个新的数据框,其中包含基于最后 4 个观察结果的给定观察结果的百分比顺序和观察结果本身。

对于这个简化的练习,我在 Excel 中有 运行 它,新的数据框将是:

AAPL.new <- c(NA,NA,NA,NA,0.75,0.75,0.5,0.5,0,0.25)
MSFT.new <- c(NA,NA,NA,NA,0,0.75,1,1,0.5,0.75)
df.new <- c(AAPL.new, MSFT.new)

我是初学者,试图从 Excel 中的小样本转移到 R 中的大样本。在 Excel 中,此练习的函数是 percentrank。

R 中的等效函数是什么?我试过 quantile() 但我不知道如何让它给我一个移动矩阵的百分比顺序。

提前感谢您的帮助

我们可以为这个工作写一个辅助函数prank

prank <- function(x, n){
    sapply(seq_along(x), function(i){
        if(i > n) sum(x[i] > x[(i-n):(i-1)]) / n
        else NA
    })
}

df.new <- as.data.frame(lapply(df, prank, n = 4))
# > df.new
#    AAPL MSFT
# 1    NA   NA
# 2    NA   NA
# 3    NA   NA
# 4    NA   NA
# 5  0.75 0.00
# 6  0.75 0.75
# 7  0.50 1.00
# 8  0.50 1.00
# 9  0.00 0.50
# 10 0.25 0.75