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