首页 > 解决方案 > R语言中带有分位数的滚动平均值

问题描述

roll = df.rolling(window=3, center=False).quantile(0.5)

我作为 DF 传递 [72,73,74,71,75,72,77,75,72,79,73,72]

我得到最小74最大值77

我在 Python 中做的这段代码

我想在 R 中做到这一点

R 中有很多库,caTools还有更多

runquantile(data[,2],3,probs = 0.5)(我试过这个)

但没有人正常工作

请帮帮我

编辑。

根据 OP 评论,这里是数据和代码。这对我有用

DF <- c(72, 73, 74, 71, 75, 72, 77, 75, 72, 79, 73, 72)
runquantile(DF, 3, probs = 0.5)

标签: pythonr

解决方案


几乎没有例外,任何对我“滚动”的东西都暗示了这个zoo包:

zoo::rollapply(DF, k=3, FUN=median) 
#  [1] 73 73 74 72 75 75 75 75 73 73
### this returns length(DF)-2*floor(width/2),
### problem if putting into a data.frame .. if so, then pad it:
zoo::rollapply(DF, 3, FUN=median, fill=NA)
#  [1] NA 73 73 74 72 75 75 75 75 73 73 NA

(我将从这里开始。)

分位数:

zoo::rollapply(DF, width=3, quantile, probs=0.5, fill=NA)
#     50% 50% 50% 50% 50% 50% 50% 50% 50% 50%     
#  NA  73  73  74  72  75  75  75  75  73  73  NA 

具有多个的分位数probs返回一个矩阵:

zoo::rollapply(DF, width=3, quantile, probs=c(0.5,0.6), fill=NA)
#       50%  60%
#  [1,]  NA   NA
#  [2,]  73 73.2
#  [3,]  73 73.2
#  [4,]  74 74.2
#  [5,]  72 72.6
#  [6,]  75 75.4
#  [7,]  75 75.4
#  [8,]  75 75.4
#  [9,]  75 75.8
# [10,]  73 74.2
# [11,]  73 74.2
# [12,]  NA   NA

同样的事情,但我们可以编写一个函数(匿名或命名)来做我们需要的任何事情:

zoo::rollapply(DF, width=3, FUN = function(x) quantile(x, probs=c(0.5,0.6)), fill=NA)

为清楚起见,您的陈述“我得到最小 74 最大 77”可能会产生误导。我得到了完整的数据:

In [15]: DF = pd.DataFrame({'B': [72,73,74,71,75,72,77,75,72,79,73,72]})

In [16]: DF.rolling(window=3, center=False).quantile(0.5)
Out[16]: 
       B
0    NaN
1    NaN
2   73.0
3   73.0
4   74.0
5   72.0
6   75.0
7   75.0
8   75.0
9   75.0
10  73.0
11  73.0

因为center=False,也许上面的调用zoo::rollapply应该使用align=

zoo::rollapply(DF, width=3, quantile, probs=0.5, fill = NA, align="right")
#         50% 50% 50% 50% 50% 50% 50% 50% 50% 50% 
#  NA  NA  73  73  74  72  75  75  75  75  73  73 

50%标签是使用的产物,可以quantile安全地忽略和/或删除,如

zoo::rollapply(DF, width=3, quantile, probs=0.5, fill = NA, align="right", names=FALSE)
#  [1] NA NA 73 73 74 72 75 75 75 75 73 73

推荐阅读