Skip to main content
AI Assist is now on Stack Overflow. Start a chat to get instant answers from across the network. Sign up to save and share your chats.
added 819 characters in body
Source Link
akrun
  • 891k
  • 38
  • 590
  • 700
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 
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)

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 
added 36 characters in body
Source Link
akrun
  • 891k
  • 38
  • 590
  • 700
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 #14#20 6.10 2.92 45.70 1.45 versicolorvirginica #11#9 5 6.07 2.05 3.5.8 1.08 versicolorvirginica #25#15 65.48 2.98 45.31 12.34 versicolorvirginica #13#10 67.02 23.26 46.01 12.05 versicolorvirginica #9 #12 6.64 2.97 45.63 1.39 versicolorvirginica #24#49 6.12 23.84 45.74 1.2.3 versicolorvirginica #48#22 65.26 2.98 4.39 12.30 versicolorvirginica #6 #34 56.73 2.8 4.5.1 1.35 versicolorvirginica #49#2  5.18 2.57 35.01 1.19 versicolorvirginica #30#44 56.78 23.62 3.5.9 12.03 versicolorvirginica 
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.2) #Sepal.Length Sepal.Width Petal.Length Petal.Width  Species #14 6.1 2.9 4.7 1.4 versicolor #11 5.0 2.0 3.5 1.0 versicolor #25 6.4 2.9 4.3 1.3 versicolor #13 6.0 2.2 4.0 1.0 versicolor #9  6.6 2.9 4.6 1.3 versicolor #24 6.1 2.8 4.7 1.2 versicolor #48 6.2 2.9 4.3 1.3 versicolor #6  5.7 2.8 4.5 1.3 versicolor #49 5.1 2.5 3.0 1.1 versicolor #30 5.7 2.6 3.5 1.0 versicolor 
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 
Source Link
akrun
  • 891k
  • 38
  • 590
  • 700

We can make use of the quosures from the devel version of dplyr (soon to be released 0.6.0) for creating the function

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.2) #Sepal.Length Sepal.Width Petal.Length Petal.Width Species #14 6.1 2.9 4.7 1.4 versicolor #11 5.0 2.0 3.5 1.0 versicolor #25 6.4 2.9 4.3 1.3 versicolor #13 6.0 2.2 4.0 1.0 versicolor #9 6.6 2.9 4.6 1.3 versicolor #24 6.1 2.8 4.7 1.2 versicolor #48 6.2 2.9 4.3 1.3 versicolor #6 5.7 2.8 4.5 1.3 versicolor #49 5.1 2.5 3.0 1.1 versicolor #30 5.7 2.6 3.5 1.0 versicolor 

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)