我是初学者,我有一个xts对象有1列和10000行,数据确实包含一些NA' s。我试图在同一列中的下4个值中找到每个值的等级。例如,如果我在col 1中有这些值:
01/02/2018 25
12/29/2017 16
12/28/2017 22
12/27/2017 6
12/26/2017 17
12/21/2017 11
我想要这个结果:
01/02/2018 1 (25 is rank 1 of 25,16,22,6)
12/29/2017 3 (16 is rank 3 of 16,22,6,17)
12/28/2017 1 (22 is rank 1 of 22,6,17,11)
我尝试过多种不同的排名函数,包括:
apply(xts, 2, rank)
这将对整个xts中的每个值进行排名,而不是对前面4个值中的每个值进行排名。我似乎无法解决这个问题。任何帮助将不胜感激。
答案 0 :(得分:2)
您可以使用zoo::rollapply
:
library(zoo);
window <- 4;
df2 <- as.data.frame(replace(df, 2, rollapply(zoo(
df[, 2]),
window,
function(x) (window + 1 - rank(x))[1],
align = "left", fill = NA)));
df2[complete.cases(df2), ];
# V1 V2
#1 2018-01-02 1
#2 2017-12-29 3
#3 2017-12-28 1
df <- read.table(text =
"01/02/2018 25
12/29/2017 16
12/28/2017 22
12/27/2017 6
12/26/2017 17
12/21/2017 11", header = F)