R:随着数据集的增长,基于通用滚动十分位数创建一个因子变量

R: Create a factor variable based on generic rolling deciles as dataset grows

我可以使用下面的代码为我的数据的十分位数创建一个因子变量,它考虑了整个历史:

`q <- quantile(x, seq(0,1,0.1), na.rm = TRUE)
decilab <- c("1st","2nd","3rd","4th","5th","6th","7th","8th","9th","10th")
q.factor <- cut(x, unique(q), included.lowest = TRUE, labels = decilab)`

但是,我需要在滚动的基础上进行通用的十分位数切割,只考虑标记点之前的历史记录。下面的代码使用 for 循环将滚动 quantile 计算为 9 个不同的变量,但我不确定如何将其转换为单个因子变量(我也不是特别 want/need 这些变量存在)。

`for(i in 1:length(x)){
   D1[i] <- quantile(x[1:i],0.1, na.rm = TRUE)
   D2[i] <- quantile(x[1:i],0.2, na.rm = TRUE)
   D3[i] <- quantile(x[1:i],0.3, na.rm = TRUE)
   D4[i] <- quantile(x[1:i],0.4, na.rm = TRUE)
   D5[i] <- quantile(x[1:i],0.5, na.rm = TRUE)
   D6[i] <- quantile(x[1:i],0.6, na.rm = TRUE)
   D7[i] <- quantile(x[1:i],0.7, na.rm = TRUE)
   D8[i] <- quantile(x[1:i],0.8, na.rm = TRUE)
   D9[i] <- quantile(x[1:i],0.9, na.rm = TRUE)
}`

必须有更好的方法!感谢您的帮助,如果这是一个常见问题,我深表歉意 - 到目前为止我还没有发现任何问题。

编辑:抱歉,我是 Stack Overflow 和 R 的新手。我想我有一个更好的例子,但我不确定如何重新提交这个问题。

假设您有向量 x <- 1:1000,目标是使用 cut(x, seq(0,1,0.1), include.lowest = TRUE) 将此数据分成十分位数,但是这会将整个系列 x 分成桶 [0,100), [100, 200)...etc 但是,我的目标是分桶是可变的,仅基于前面的数据,而不是整个向量。所以本质上,每个点都在 "top decile" 中,因为这个序列是线性的,但是对于随机序列,最新点的十分位数仅相对于后续点而不是整个序列确定。

我尝试了以下方法:

`for (i in 1:length(x)){
    z[i] <- as.numeric(cut(x[1:i], quantile(x[1:i], seq(0,1,.1))))[i]
 } `

然而这不起作用

`library(dplyr)
x <- 1:1000
y<-vector(mode="numeric",length=0)
for (i in 1:length(x)){
   y[i]<-last(ntile(x[1:i],10))
}`

这似乎有效!

一位同事的建议是 dplyr::ntile 优于 cut