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
我可以使用下面的代码为我的数据的十分位数创建一个因子变量,它考虑了整个历史:
`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