findInterval()
5.0.2 Exercise 5-21
p_winsorised_mean <- function(x, p) {
# calculate quantile cutoffs
x_quantiles <- c(-Inf,
quantile(x, c(p, 1-p), names = FALSE),
Inf)
# map quantiles to x indices
x_intervals <- findInterval(x, x_quantiles)
x_winsorised <- ifelse(x_intervals==2,
x,
ifelse(x == 1, x_quantiles[2], x_quantiles[3]))
return(mean(x_winsorised))
}
x <- c(8, 5, 2, 9, 7, 4, 6, 1, 3)
p <- .25
p_winsorised_mean(x, p)
## [1] 5.444444