library(tidyverse)
library(modelr)

ci_boot <- function(df, x, fun = mean, B = 100, alpha = .05) {
  x_expr <- enquo(x)
  fun_expr <- enquo(fun)
  x_name <- paste(quo_name(fun_expr), quo_name(x_expr), sep = "_")
  x_name_min <- paste0(x_name, "_min") 
  x_name_max <- paste0(x_name, "_max") 
  
  summ <- df %>% select(!!x_expr) %>% pull() %>% fun()
  
  ci <- df %>% 
    bootstrap(B) %>% 
    mutate(b = map_dbl(strap, ~as_tibble(.) %>% 
                         select(!!x_expr) %>% 
                         pull() %>% 
                         fun())) %>% 
    summarise(!!x_name_min := quantile(b, alpha / 2),
              !!x_name_max := quantile(b, 1 - alpha / 2))
  
  tibble(!!x_name := summ) %>% bind_cols(ci)
}

# mean for one group of data
mtcars %>% ci_boot(mpg)
## # A tibble: 1 x 3
##   mean_mpg mean_mpg_min mean_mpg_max
##      <dbl>        <dbl>        <dbl>
## 1 20.09062     18.17219     21.83008
# standard deviation for several groups
mtcars %>% 
  group_by(cyl) %>% 
  nest() %>% 
  mutate(temp = map(data, ~ci_boot(., mpg, fun = sd))) %>% 
  unnest(temp) %>% 
  select(-data)
## # A tibble: 3 x 4
##     cyl   sd_mpg sd_mpg_min sd_mpg_max
##   <dbl>    <dbl>      <dbl>      <dbl>
## 1     6 1.453567  0.7655649   1.735361
## 2     4 4.509828  3.1092842   5.485399
## 3     8 2.560048  1.5471192   3.260992