我注意到基本的R quantile函数不支持日期参数。
我赞赏为日期定义分位数需要在定义中加以注意(即,如果您有6个日期并要求第25个百分位数,则需要定义合适的舍入)。
是否有这种分位数功能的有效实现,可以作为基础或其他程序包的一部分。
以下示例函数实质上实现了我感兴趣的功能(通过一些调整来处理第0个百分位数的情况),但是我认为可以实现更有效的实现。
#Date quantile function.
dquantile <- function(x, probs){
sx <- sort(x)
pos <- round( probs * length(x) )
return( sx[pos] )
}
# Example.
dates <- as.Date("01/01/1900", "%d/%m/%Y") + floor( 36500 * runif(100000) )
dquantile(dates, c(0.001, 0.025, 0.975, 0.999) )
Run Code Online (Sandbox Code Playgroud)
If x is a vector of Dates and probs is a vector of probabilities:
# test input
x <- as.Date("2018-03-21") + 0:10
probs <- 1:9/10
as.Date(quantile(unclass(x), probs), origin = "1970-01-01")
Run Code Online (Sandbox Code Playgroud)
giving:
10% 20% 30% 40% 50% 60%
"2018-03-22" "2018-03-23" "2018-03-24" "2018-03-25" "2018-03-26" "2018-03-27"
70% 80% 90%
"2018-03-28" "2018-03-29" "2018-03-30"
Run Code Online (Sandbox Code Playgroud)
该quantile函数确实支持日期,您只需要指定type参数即可。您的问题可以通过以下方法解决:
dates <- as.Date("01/01/1900", "%d/%m/%Y") + floor( 36500 * runif(100000) )
quantile(dates, probs = c(0.001, 0.025, 0.975, 0.999), type = 1)
0.1% 2.5% 97.5% 99.9%
"1900-02-04" "1902-06-23" "1997-06-10" "1999-10-30"
Run Code Online (Sandbox Code Playgroud)