library(tidyverse) f.sample <- function(dat, colN, value, perc){ colN <- enquo(colN) value <- quo_name(enquo(value)) dat %>% filter(UQ(colN) == UQ(value)) %>% sample_frac(perc) %>% droplevels } f.sample(iris, Species, versicolor, 0.8) f.sample(iris, Species, virginica, 0.2) #Sepal.Length Sepal.Width Petal.Length Petal.Width Species #20 6.0 2.2 5.0 1.5 virginica #9 6.7 2.5 5.8 1.8 virginica #15 5.8 2.8 5.1 2.4 virginica #10 7.2 3.6 6.1 2.5 virginica #12 6.4 2.7 5.3 1.9 virginica #49 6.2 3.4 5.4 2.3 virginica #22 5.6 2.8 4.9 2.0 virginica #34 6.3 2.8 5.1 1.5 virginica #2 5.8 2.7 5.1 1.9 virginica #44 6.8 3.2 5.9 2.3 virginica The enquo does similar functionality as substitute by taking the input arguments and convert it to quosure, while quo_name convert to string, and within the filter/group_by/summarise/mutate the quosures are evaluated by unquoting (!! or UQ)
Based on the comments below, we modified the function so that it would work for other cases
f.sample2 <- function(dat, colN, values, perc){ colN <- enquo(colN) dat %>% filter(UQ(colN) %in% values) %>% droplevels %>% nest(-UQ(colN)) %>% .$data %>% setNames(values) %>% Map(sample_frac, ., perc) %>% bind_rows(.id = quo_name(colN)) } res <- f.sample2(iris, Species, c("versicolor", "virginica"), c(0.8, 0.2)) prop.table(table(res$Species)) #versicolor virginica # 0.8 0.2